mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2026-01-07 16:11:43 +00:00
drivers/usb/acpi: Add a driver for generating USB ACPI
Add a support for generating USB port descriptors for ACPI based
on their definition by the board in devicetree.cb. This will
generate a _UPC and _PLD for each port, using a generic _PLD by
default. The _PLD can also be customized for more accurate
descriptions if necessary.
This sample devictree.cb shows a USB 2.0 type-A port behind a root
hub connected to an xHCI controller:
device pci 14.0 on
chip drivers/usb/acpi
register "desc" = ""Root Hub""
register "type" = "UPC_TYPE_HUB"
device usb 0.0 on
chip drivers/usb/acpi
register "desc" = ""USB 2.0 Type-A""
register "type" = "UPC_TYPE_A"
device usb 2.0 on end
end
end
end
end
It will generate the following ACPI code in the SSDT:
Scope (\_SB.PCI0.XHCI.RHUB.HS01)
{
Name (_DDN, "USB 2.0 Type-A")
Name (_UPC, Package (0x04)
{
0xFF,
0x00,
Zero,
Zero
})
Name (_PLD, ToPLD (
PLD_Revision = 0x2,
PLD_IgnoreColor = 0x1,
PLD_Red = 0x0,
PLD_Green = 0x0,
PLD_Blue = 0x0,
PLD_Width = 0x0,
PLD_Height = 0x0,
PLD_UserVisible = 0x1,
PLD_Dock = 0x0,
PLD_Lid = 0x0,
PLD_Panel = "UNKNOWN",
PLD_VerticalPosition = "CENTER",
PLD_HorizontalPosition = "CENTER",
PLD_Shape = "RECTANGLE",
PLD_GroupOrientation = 0x0,
PLD_GroupToken = 0x0,
PLD_GroupPosition = 0x0,
PLD_Bay = 0x0,
PLD_Ejectable = 0x0,
PLD_EjectRequired = 0x0,
PLD_CabinetNumber = 0x0,
PLD_CardCageNumber = 0x0,
PLD_Reference = 0x0,
PLD_Rotation = 0x0,
PLD_Order = 0x0,
PLD_VerticalOffset = 0x0,
PLD_HorizontalOffset = 0x0)
)
}
Change-Id: I7024390e407fda4b195211bd4755bb5ca53b2b37
Signed-off-by: Duncan Laurie <dlaurie@google.com>
Reviewed-on: https://review.coreboot.org/26173
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-by: Furquan Shaikh <furquan@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
committed by
Patrick Georgi
parent
8ccf59a947
commit
4721f43390
4
src/drivers/usb/acpi/Kconfig
Normal file
4
src/drivers/usb/acpi/Kconfig
Normal file
@@ -0,0 +1,4 @@
|
||||
config DRIVERS_USB_ACPI
|
||||
bool
|
||||
default n
|
||||
depends on HAVE_ACPI_TABLES
|
||||
1
src/drivers/usb/acpi/Makefile.inc
Normal file
1
src/drivers/usb/acpi/Makefile.inc
Normal file
@@ -0,0 +1 @@
|
||||
ramstage-$(CONFIG_DRIVERS_USB_ACPI) += usb_acpi.c
|
||||
54
src/drivers/usb/acpi/chip.h
Normal file
54
src/drivers/usb/acpi/chip.h
Normal file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright 2018 Google LLC
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __USB_ACPI_CHIP_H__
|
||||
#define __USB_ACPI_CHIP_H__
|
||||
|
||||
#include <arch/acpi.h>
|
||||
#include <arch/acpi_pld.h>
|
||||
|
||||
struct drivers_usb_acpi_config {
|
||||
const char *desc;
|
||||
|
||||
/*
|
||||
* Physical ports that are user visible
|
||||
*
|
||||
* UPC_TYPE_A
|
||||
* UPC_TYPE_MINI_AB
|
||||
* UPC_TYPE_EXPRESSCARD
|
||||
* UPC_TYPE_USB3_A
|
||||
* UPC_TYPE_USB3_B
|
||||
* UPC_TYPE_USB3_MICRO_B
|
||||
* UPC_TYPE_USB3_MICRO_AB
|
||||
* UPC_TYPE_USB3_POWER_B
|
||||
* UPC_TYPE_C_USB2_ONLY
|
||||
* UPC_TYPE_C_USB2_SS_SWITCH
|
||||
* UPC_TYPE_C_USB2_SS
|
||||
*
|
||||
* Non-visible ports or special devices
|
||||
*
|
||||
* UPC_TYPE_PROPRIETARY
|
||||
* UPC_TYPE_INTERNAL
|
||||
* UPC_TYPE_UNUSED
|
||||
* UPC_TYPE_HUB
|
||||
*/
|
||||
enum acpi_upc_type type;
|
||||
|
||||
/* Define a custom physical location for the port */
|
||||
bool use_custom_pld;
|
||||
struct acpi_pld custom_pld;
|
||||
};
|
||||
|
||||
#endif /* __USB_ACPI_CHIP_H__ */
|
||||
75
src/drivers/usb/acpi/usb_acpi.c
Normal file
75
src/drivers/usb/acpi/usb_acpi.c
Normal file
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright 2018 Google LLC
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <arch/acpi_device.h>
|
||||
#include <arch/acpi_pld.h>
|
||||
#include <arch/acpigen.h>
|
||||
#include <console/console.h>
|
||||
#include <device/device.h>
|
||||
#include <device/path.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include "chip.h"
|
||||
|
||||
static void usb_acpi_fill_ssdt_generator(struct device *dev)
|
||||
{
|
||||
struct drivers_usb_acpi_config *config = dev->chip_info;
|
||||
const char *path = acpi_device_path(dev);
|
||||
|
||||
if (!dev->enabled || !path || !config)
|
||||
return;
|
||||
|
||||
/* Don't generate output for hubs, only ports */
|
||||
if (config->type == UPC_TYPE_HUB)
|
||||
return;
|
||||
|
||||
acpigen_write_scope(path);
|
||||
if (config->desc)
|
||||
acpigen_write_name_string("_DDN", config->desc);
|
||||
acpigen_write_upc(config->type);
|
||||
|
||||
if (config->use_custom_pld) {
|
||||
/* Use board defined PLD */
|
||||
acpigen_write_pld(&config->custom_pld);
|
||||
} else {
|
||||
/* Fill PLD strucutre based on port type */
|
||||
struct acpi_pld pld;
|
||||
acpi_pld_fill_usb(&pld, config->type);
|
||||
acpigen_write_pld(&pld);
|
||||
}
|
||||
|
||||
acpigen_pop_len();
|
||||
|
||||
printk(BIOS_INFO, "%s: %s at %s\n", path,
|
||||
config->desc ? : dev->chip_ops->name, dev_path(dev));
|
||||
}
|
||||
|
||||
static struct device_operations usb_acpi_ops = {
|
||||
.read_resources = DEVICE_NOOP,
|
||||
.set_resources = DEVICE_NOOP,
|
||||
.enable_resources = DEVICE_NOOP,
|
||||
.scan_bus = &scan_usb_bus,
|
||||
.acpi_fill_ssdt_generator = &usb_acpi_fill_ssdt_generator,
|
||||
};
|
||||
|
||||
static void usb_acpi_enable(struct device *dev)
|
||||
{
|
||||
dev->ops = &usb_acpi_ops;
|
||||
}
|
||||
|
||||
struct chip_operations drivers_usb_acpi_ops = {
|
||||
CHIP_NAME("USB ACPI Device")
|
||||
.enable_dev = &usb_acpi_enable
|
||||
};
|
||||
Reference in New Issue
Block a user