mirror of https://github.com/torvalds/linux.git
Merge branch 'acpi-bus'
Merge changes related to _OSC handling and updates eliminating the owner field from struct acpi_driver: - Make the kernel indicate support for several ACPI features that are in fact supported to the platform firmware through _OSC and fix the Generic Initiator Affinity _OSC bit (Armin Wolf). - Make the ACPI core set the owner value for ACPI drivers, drop the owner setting from a number of drivers and eliminate the owner field from struct acpi_driver (Krzysztof Kozlowski). * acpi-bus: (24 commits) ACPI: drop redundant owner from acpi_driver virt: vmgenid: drop owner assignment ptp: vmw: drop owner assignment platform/x86/wireless-hotkey: drop owner assignment platform/x86/toshiba_haps: drop owner assignment platform/x86/toshiba_bluetooth: drop owner assignment platform/x86/toshiba_acpi: drop owner assignment platform/x86/sony-laptop: drop owner assignment platform/x86/lg-laptop: drop owner assignment platform/x86/intel/smartconnect: drop owner assignment platform/x86/intel/rst: drop owner assignment platform/x86/eeepc: drop owner assignment platform/x86/dell: drop owner assignment platform: classmate-laptop: drop owner assignment platform: asus-laptop: drop owner assignment platform/chrome: wilco_ec: drop owner assignment net: fjes: drop owner assignment Input: atlas - drop owner assignment ACPI: store owner from modules with acpi_bus_register_driver() ACPI: bus: Indicate support for IRQ ResourceSource thru _OSC ...
This commit is contained in:
commit
82303dd304
|
|
@ -316,9 +316,14 @@ static void acpi_bus_osc_negotiate_platform_control(void)
|
||||||
capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_PAD_SUPPORT;
|
capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_PAD_SUPPORT;
|
||||||
if (IS_ENABLED(CONFIG_ACPI_PROCESSOR))
|
if (IS_ENABLED(CONFIG_ACPI_PROCESSOR))
|
||||||
capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_PPC_OST_SUPPORT;
|
capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_PPC_OST_SUPPORT;
|
||||||
|
if (IS_ENABLED(CONFIG_ACPI_THERMAL))
|
||||||
|
capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_FAST_THERMAL_SAMPLING_SUPPORT;
|
||||||
|
|
||||||
capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_HOTPLUG_OST_SUPPORT;
|
capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_HOTPLUG_OST_SUPPORT;
|
||||||
capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_PCLPI_SUPPORT;
|
capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_PCLPI_SUPPORT;
|
||||||
|
capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_OVER_16_PSTATES_SUPPORT;
|
||||||
|
capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_GED_SUPPORT;
|
||||||
|
capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_IRQ_RESOURCE_SOURCE_SUPPORT;
|
||||||
if (IS_ENABLED(CONFIG_ACPI_PRMT))
|
if (IS_ENABLED(CONFIG_ACPI_PRMT))
|
||||||
capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_PRM_SUPPORT;
|
capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_PRM_SUPPORT;
|
||||||
if (IS_ENABLED(CONFIG_ACPI_FFH))
|
if (IS_ENABLED(CONFIG_ACPI_FFH))
|
||||||
|
|
@ -990,25 +995,26 @@ EXPORT_SYMBOL_GPL(acpi_driver_match_device);
|
||||||
-------------------------------------------------------------------------- */
|
-------------------------------------------------------------------------- */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* acpi_bus_register_driver - register a driver with the ACPI bus
|
* __acpi_bus_register_driver - register a driver with the ACPI bus
|
||||||
* @driver: driver being registered
|
* @driver: driver being registered
|
||||||
|
* @owner: owning module/driver
|
||||||
*
|
*
|
||||||
* Registers a driver with the ACPI bus. Searches the namespace for all
|
* Registers a driver with the ACPI bus. Searches the namespace for all
|
||||||
* devices that match the driver's criteria and binds. Returns zero for
|
* devices that match the driver's criteria and binds. Returns zero for
|
||||||
* success or a negative error status for failure.
|
* success or a negative error status for failure.
|
||||||
*/
|
*/
|
||||||
int acpi_bus_register_driver(struct acpi_driver *driver)
|
int __acpi_bus_register_driver(struct acpi_driver *driver, struct module *owner)
|
||||||
{
|
{
|
||||||
if (acpi_disabled)
|
if (acpi_disabled)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
driver->drv.name = driver->name;
|
driver->drv.name = driver->name;
|
||||||
driver->drv.bus = &acpi_bus_type;
|
driver->drv.bus = &acpi_bus_type;
|
||||||
driver->drv.owner = driver->owner;
|
driver->drv.owner = owner;
|
||||||
|
|
||||||
return driver_register(&driver->drv);
|
return driver_register(&driver->drv);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(acpi_bus_register_driver);
|
EXPORT_SYMBOL(__acpi_bus_register_driver);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* acpi_bus_unregister_driver - unregisters a driver with the ACPI bus
|
* acpi_bus_unregister_driver - unregisters a driver with the ACPI bus
|
||||||
|
|
|
||||||
|
|
@ -127,7 +127,6 @@ MODULE_DEVICE_TABLE(acpi, atlas_device_ids);
|
||||||
static struct acpi_driver atlas_acpi_driver = {
|
static struct acpi_driver atlas_acpi_driver = {
|
||||||
.name = ACPI_ATLAS_NAME,
|
.name = ACPI_ATLAS_NAME,
|
||||||
.class = ACPI_ATLAS_CLASS,
|
.class = ACPI_ATLAS_CLASS,
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.ids = atlas_device_ids,
|
.ids = atlas_device_ids,
|
||||||
.ops = {
|
.ops = {
|
||||||
.add = atlas_acpi_button_add,
|
.add = atlas_acpi_button_add,
|
||||||
|
|
|
||||||
|
|
@ -156,7 +156,6 @@ static void fjes_acpi_remove(struct acpi_device *device)
|
||||||
static struct acpi_driver fjes_acpi_driver = {
|
static struct acpi_driver fjes_acpi_driver = {
|
||||||
.name = DRV_NAME,
|
.name = DRV_NAME,
|
||||||
.class = DRV_NAME,
|
.class = DRV_NAME,
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.ids = fjes_acpi_ids,
|
.ids = fjes_acpi_ids,
|
||||||
.ops = {
|
.ops = {
|
||||||
.add = fjes_acpi_add,
|
.add = fjes_acpi_add,
|
||||||
|
|
|
||||||
|
|
@ -523,7 +523,6 @@ static struct acpi_driver event_driver = {
|
||||||
.notify = event_device_notify,
|
.notify = event_device_notify,
|
||||||
.remove = event_device_remove,
|
.remove = event_device_remove,
|
||||||
},
|
},
|
||||||
.owner = THIS_MODULE,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init event_module_init(void)
|
static int __init event_module_init(void)
|
||||||
|
|
|
||||||
|
|
@ -1925,7 +1925,6 @@ MODULE_DEVICE_TABLE(acpi, asus_device_ids);
|
||||||
static struct acpi_driver asus_acpi_driver = {
|
static struct acpi_driver asus_acpi_driver = {
|
||||||
.name = ASUS_LAPTOP_NAME,
|
.name = ASUS_LAPTOP_NAME,
|
||||||
.class = ASUS_LAPTOP_CLASS,
|
.class = ASUS_LAPTOP_CLASS,
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.ids = asus_device_ids,
|
.ids = asus_device_ids,
|
||||||
.flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
|
.flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
|
||||||
.ops = {
|
.ops = {
|
||||||
|
|
|
||||||
|
|
@ -434,7 +434,6 @@ static const struct acpi_device_id cmpc_accel_device_ids_v4[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct acpi_driver cmpc_accel_acpi_driver_v4 = {
|
static struct acpi_driver cmpc_accel_acpi_driver_v4 = {
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.name = "cmpc_accel_v4",
|
.name = "cmpc_accel_v4",
|
||||||
.class = "cmpc_accel_v4",
|
.class = "cmpc_accel_v4",
|
||||||
.ids = cmpc_accel_device_ids_v4,
|
.ids = cmpc_accel_device_ids_v4,
|
||||||
|
|
@ -660,7 +659,6 @@ static const struct acpi_device_id cmpc_accel_device_ids[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct acpi_driver cmpc_accel_acpi_driver = {
|
static struct acpi_driver cmpc_accel_acpi_driver = {
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.name = "cmpc_accel",
|
.name = "cmpc_accel",
|
||||||
.class = "cmpc_accel",
|
.class = "cmpc_accel",
|
||||||
.ids = cmpc_accel_device_ids,
|
.ids = cmpc_accel_device_ids,
|
||||||
|
|
@ -754,7 +752,6 @@ static const struct acpi_device_id cmpc_tablet_device_ids[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct acpi_driver cmpc_tablet_acpi_driver = {
|
static struct acpi_driver cmpc_tablet_acpi_driver = {
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.name = "cmpc_tablet",
|
.name = "cmpc_tablet",
|
||||||
.class = "cmpc_tablet",
|
.class = "cmpc_tablet",
|
||||||
.ids = cmpc_tablet_device_ids,
|
.ids = cmpc_tablet_device_ids,
|
||||||
|
|
@ -996,7 +993,6 @@ static const struct acpi_device_id cmpc_ipml_device_ids[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct acpi_driver cmpc_ipml_acpi_driver = {
|
static struct acpi_driver cmpc_ipml_acpi_driver = {
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.name = "cmpc",
|
.name = "cmpc",
|
||||||
.class = "cmpc",
|
.class = "cmpc",
|
||||||
.ids = cmpc_ipml_device_ids,
|
.ids = cmpc_ipml_device_ids,
|
||||||
|
|
@ -1064,7 +1060,6 @@ static const struct acpi_device_id cmpc_keys_device_ids[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct acpi_driver cmpc_keys_acpi_driver = {
|
static struct acpi_driver cmpc_keys_acpi_driver = {
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.name = "cmpc_keys",
|
.name = "cmpc_keys",
|
||||||
.class = "cmpc_keys",
|
.class = "cmpc_keys",
|
||||||
.ids = cmpc_keys_device_ids,
|
.ids = cmpc_keys_device_ids,
|
||||||
|
|
|
||||||
|
|
@ -295,7 +295,6 @@ static struct acpi_driver rbtn_driver = {
|
||||||
.remove = rbtn_remove,
|
.remove = rbtn_remove,
|
||||||
.notify = rbtn_notify,
|
.notify = rbtn_notify,
|
||||||
},
|
},
|
||||||
.owner = THIS_MODULE,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1463,7 +1463,6 @@ MODULE_DEVICE_TABLE(acpi, eeepc_device_ids);
|
||||||
static struct acpi_driver eeepc_acpi_driver = {
|
static struct acpi_driver eeepc_acpi_driver = {
|
||||||
.name = EEEPC_LAPTOP_NAME,
|
.name = EEEPC_LAPTOP_NAME,
|
||||||
.class = EEEPC_ACPI_CLASS,
|
.class = EEEPC_ACPI_CLASS,
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.ids = eeepc_device_ids,
|
.ids = eeepc_device_ids,
|
||||||
.flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
|
.flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
|
||||||
.ops = {
|
.ops = {
|
||||||
|
|
|
||||||
|
|
@ -125,7 +125,6 @@ static const struct acpi_device_id irst_ids[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct acpi_driver irst_driver = {
|
static struct acpi_driver irst_driver = {
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.name = "intel_rapid_start",
|
.name = "intel_rapid_start",
|
||||||
.class = "intel_rapid_start",
|
.class = "intel_rapid_start",
|
||||||
.ids = irst_ids,
|
.ids = irst_ids,
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,6 @@ static const struct acpi_device_id smartconnect_ids[] = {
|
||||||
MODULE_DEVICE_TABLE(acpi, smartconnect_ids);
|
MODULE_DEVICE_TABLE(acpi, smartconnect_ids);
|
||||||
|
|
||||||
static struct acpi_driver smartconnect_driver = {
|
static struct acpi_driver smartconnect_driver = {
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.name = "intel_smart_connect",
|
.name = "intel_smart_connect",
|
||||||
.class = "intel_smart_connect",
|
.class = "intel_smart_connect",
|
||||||
.ids = smartconnect_ids,
|
.ids = smartconnect_ids,
|
||||||
|
|
|
||||||
|
|
@ -790,7 +790,6 @@ static struct acpi_driver acpi_driver = {
|
||||||
.remove = acpi_remove,
|
.remove = acpi_remove,
|
||||||
.notify = acpi_notify,
|
.notify = acpi_notify,
|
||||||
},
|
},
|
||||||
.owner = THIS_MODULE,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init acpi_init(void)
|
static int __init acpi_init(void)
|
||||||
|
|
|
||||||
|
|
@ -3303,7 +3303,6 @@ static struct acpi_driver sony_nc_driver = {
|
||||||
.name = SONY_NC_DRIVER_NAME,
|
.name = SONY_NC_DRIVER_NAME,
|
||||||
.class = SONY_NC_CLASS,
|
.class = SONY_NC_CLASS,
|
||||||
.ids = sony_nc_device_ids,
|
.ids = sony_nc_device_ids,
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.ops = {
|
.ops = {
|
||||||
.add = sony_nc_add,
|
.add = sony_nc_add,
|
||||||
.remove = sony_nc_remove,
|
.remove = sony_nc_remove,
|
||||||
|
|
@ -4844,7 +4843,6 @@ static struct acpi_driver sony_pic_driver = {
|
||||||
.name = SONY_PIC_DRIVER_NAME,
|
.name = SONY_PIC_DRIVER_NAME,
|
||||||
.class = SONY_PIC_CLASS,
|
.class = SONY_PIC_CLASS,
|
||||||
.ids = sony_pic_device_ids,
|
.ids = sony_pic_device_ids,
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.ops = {
|
.ops = {
|
||||||
.add = sony_pic_add,
|
.add = sony_pic_add,
|
||||||
.remove = sony_pic_remove,
|
.remove = sony_pic_remove,
|
||||||
|
|
|
||||||
|
|
@ -3583,7 +3583,6 @@ static SIMPLE_DEV_PM_OPS(toshiba_acpi_pm,
|
||||||
|
|
||||||
static struct acpi_driver toshiba_acpi_driver = {
|
static struct acpi_driver toshiba_acpi_driver = {
|
||||||
.name = "Toshiba ACPI driver",
|
.name = "Toshiba ACPI driver",
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.ids = toshiba_device_ids,
|
.ids = toshiba_device_ids,
|
||||||
.flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
|
.flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
|
||||||
.ops = {
|
.ops = {
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,6 @@ static struct acpi_driver toshiba_bt_rfkill_driver = {
|
||||||
.remove = toshiba_bt_rfkill_remove,
|
.remove = toshiba_bt_rfkill_remove,
|
||||||
.notify = toshiba_bt_rfkill_notify,
|
.notify = toshiba_bt_rfkill_notify,
|
||||||
},
|
},
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.drv.pm = &toshiba_bt_pm,
|
.drv.pm = &toshiba_bt_pm,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -251,7 +251,6 @@ MODULE_DEVICE_TABLE(acpi, haps_device_ids);
|
||||||
|
|
||||||
static struct acpi_driver toshiba_haps_driver = {
|
static struct acpi_driver toshiba_haps_driver = {
|
||||||
.name = "Toshiba HAPS",
|
.name = "Toshiba HAPS",
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.ids = haps_device_ids,
|
.ids = haps_device_ids,
|
||||||
.flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
|
.flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
|
||||||
.ops = {
|
.ops = {
|
||||||
|
|
|
||||||
|
|
@ -110,7 +110,6 @@ static void wl_remove(struct acpi_device *device)
|
||||||
|
|
||||||
static struct acpi_driver wl_driver = {
|
static struct acpi_driver wl_driver = {
|
||||||
.name = "wireless-hotkey",
|
.name = "wireless-hotkey",
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.ids = wl_ids,
|
.ids = wl_ids,
|
||||||
.ops = {
|
.ops = {
|
||||||
.add = wl_add,
|
.add = wl_add,
|
||||||
|
|
|
||||||
|
|
@ -120,7 +120,6 @@ static struct acpi_driver ptp_vmw_acpi_driver = {
|
||||||
.add = ptp_vmw_acpi_add,
|
.add = ptp_vmw_acpi_add,
|
||||||
.remove = ptp_vmw_acpi_remove
|
.remove = ptp_vmw_acpi_remove
|
||||||
},
|
},
|
||||||
.owner = THIS_MODULE
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init ptp_vmw_init(void)
|
static int __init ptp_vmw_init(void)
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,6 @@ static const struct acpi_device_id vmgenid_ids[] = {
|
||||||
static struct acpi_driver vmgenid_driver = {
|
static struct acpi_driver vmgenid_driver = {
|
||||||
.name = "vmgenid",
|
.name = "vmgenid",
|
||||||
.ids = vmgenid_ids,
|
.ids = vmgenid_ids,
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.ops = {
|
.ops = {
|
||||||
.add = vmgenid_add,
|
.add = vmgenid_add,
|
||||||
.notify = vmgenid_notify
|
.notify = vmgenid_notify
|
||||||
|
|
|
||||||
|
|
@ -170,7 +170,6 @@ struct acpi_driver {
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
struct acpi_device_ops ops;
|
struct acpi_device_ops ops;
|
||||||
struct device_driver drv;
|
struct device_driver drv;
|
||||||
struct module *owner;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -656,7 +655,12 @@ void acpi_scan_lock_release(void);
|
||||||
void acpi_lock_hp_context(void);
|
void acpi_lock_hp_context(void);
|
||||||
void acpi_unlock_hp_context(void);
|
void acpi_unlock_hp_context(void);
|
||||||
int acpi_scan_add_handler(struct acpi_scan_handler *handler);
|
int acpi_scan_add_handler(struct acpi_scan_handler *handler);
|
||||||
int acpi_bus_register_driver(struct acpi_driver *driver);
|
/*
|
||||||
|
* use a macro to avoid include chaining to get THIS_MODULE
|
||||||
|
*/
|
||||||
|
#define acpi_bus_register_driver(drv) \
|
||||||
|
__acpi_bus_register_driver(drv, THIS_MODULE)
|
||||||
|
int __acpi_bus_register_driver(struct acpi_driver *driver, struct module *owner);
|
||||||
void acpi_bus_unregister_driver(struct acpi_driver *driver);
|
void acpi_bus_unregister_driver(struct acpi_driver *driver);
|
||||||
int acpi_bus_scan(acpi_handle handle);
|
int acpi_bus_scan(acpi_handle handle);
|
||||||
void acpi_bus_trim(struct acpi_device *start);
|
void acpi_bus_trim(struct acpi_device *start);
|
||||||
|
|
|
||||||
|
|
@ -573,9 +573,13 @@ acpi_status acpi_run_osc(acpi_handle handle, struct acpi_osc_context *context);
|
||||||
#define OSC_SB_CPCV2_SUPPORT 0x00000040
|
#define OSC_SB_CPCV2_SUPPORT 0x00000040
|
||||||
#define OSC_SB_PCLPI_SUPPORT 0x00000080
|
#define OSC_SB_PCLPI_SUPPORT 0x00000080
|
||||||
#define OSC_SB_OSLPI_SUPPORT 0x00000100
|
#define OSC_SB_OSLPI_SUPPORT 0x00000100
|
||||||
|
#define OSC_SB_FAST_THERMAL_SAMPLING_SUPPORT 0x00000200
|
||||||
|
#define OSC_SB_OVER_16_PSTATES_SUPPORT 0x00000400
|
||||||
|
#define OSC_SB_GED_SUPPORT 0x00000800
|
||||||
#define OSC_SB_CPC_DIVERSE_HIGH_SUPPORT 0x00001000
|
#define OSC_SB_CPC_DIVERSE_HIGH_SUPPORT 0x00001000
|
||||||
#define OSC_SB_GENERIC_INITIATOR_SUPPORT 0x00002000
|
#define OSC_SB_IRQ_RESOURCE_SOURCE_SUPPORT 0x00002000
|
||||||
#define OSC_SB_CPC_FLEXIBLE_ADR_SPACE 0x00004000
|
#define OSC_SB_CPC_FLEXIBLE_ADR_SPACE 0x00004000
|
||||||
|
#define OSC_SB_GENERIC_INITIATOR_SUPPORT 0x00020000
|
||||||
#define OSC_SB_NATIVE_USB4_SUPPORT 0x00040000
|
#define OSC_SB_NATIVE_USB4_SUPPORT 0x00040000
|
||||||
#define OSC_SB_PRM_SUPPORT 0x00200000
|
#define OSC_SB_PRM_SUPPORT 0x00200000
|
||||||
#define OSC_SB_FFH_OPR_SUPPORT 0x00400000
|
#define OSC_SB_FFH_OPR_SUPPORT 0x00400000
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue