PS3: Add ps3_repository_find_device_by_id()
Subsystems (3)
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 1/16 POWERPC: Add Cell SPRN bookmark register
Add a definition for the Cell SPRN bookmark register to asm-powerpc/regs.h
--- include/asm-powerpc/reg.h | 1 + 1 file changed, 1 insertion(+)
include/asm-powerpc/reg.h +1 -0
@@ -553,6 +553,7 @@#define SPRN_PA6T_BTCR 978/* Breakpoint and Tagging Control Register */ #define SPRN_PA6T_IMAAT 979/* Instruction Match Array Action Table */ #define SPRN_PA6T_PCCR 1019/* Power Counter Control Register */ +#define SPRN_BKMK 1020/* Cell Bookmark Register */ #define SPRN_PA6T_RPCCR 1021/* Retire PC Trace Control Register */
PATCH 2/16 PS3: Make bus_id and dev_id u64
In reply to a message not in the archiveFrom: Geert Uytterhoeven <[email protected]>
Change the PS3 bus_id and dev_id from type unsigned int to u64. These IDs are 64-bit in the repository, and the special storage notification device has a device ID of ULONG_MAX.
--- arch/powerpc/platforms/ps3/device-init.c | 4 ++-- arch/powerpc/platforms/ps3/mm.c | 8 ++++---- arch/powerpc/platforms/ps3/platform.h | 12 ++++++------ arch/powerpc/platforms/ps3/repository.c | 21 ++++++++------------- arch/powerpc/platforms/ps3/system-bus.c | 14 +++++++------- drivers/net/ps3_gelic_net.c | 4 ++-- include/asm-powerpc/ps3.h | 4 ++-- 7 files changed, 31 insertions(+), 36 deletions(-)
arch/powerpc/platforms/ps3/device-init.c +2 -2
@@ -297,7 +297,7 @@ static int ps3_storage_wait_for_device(cu64 dev_port; } *notify_event; -pr_debug (" -> %s:%u: (%u:%u:%u)\n" , __func__, __LINE__, repo->bus_id, +pr_debug (" -> %s:%u: (%lu:%lu:%u)\n" , __func__, __LINE__, repo->bus_id, repo->dev_id, repo->dev_type); buf =kzalloc (512 ,GFP_KERNEL );
@@ -384,7 +384,7 @@ static int ps3_storage_wait_for_device(cif (notify_event->dev_id == repo->dev_id && notify_event->dev_type ==PS3_DEV_TYPE_NOACCESS ) { -pr_debug ("%s:%u: no access: dev_id %u\n" , __func__, +pr_debug ("%s:%u: no access: dev_id %lu\n" , __func__, __LINE__, repo->dev_id);break ; }
arch/powerpc/platforms/ps3/mm.c +4 -4
@@ -359,7 +359,7 @@ static unsigned long dma_sb_lpar_to_bus(static void __maybe_unused _dma_dump_region (const struct ps3_dma_region *r,const char *func,int line) { -DBG ("%s:%d: dev %u:%u\n" , func, line, r->dev->bus_id, +DBG ("%s:%d: dev %lu:%lu\n" , func, line, r->dev->bus_id, r->dev->dev_id);DBG ("%s:%d: page_size %u\n" , func, line, r->page_size);DBG ("%s:%d: bus_addr %lxh\n" , func, line, r->bus_addr);
@@ -394,7 +394,7 @@ struct dma_chunk {static void _dma_dump_chunk (const struct dma_chunk * c,const char * func,int line) { -DBG ("%s:%d: r.dev %u:%u\n" , func, line, +DBG ("%s:%d: r.dev %lu:%lu\n" , func, line, c->region->dev->bus_id, c->region->dev->dev_id);DBG ("%s:%d: r.bus_addr %lxh\n" , func, line, c->region->bus_addr);DBG ("%s:%d: r.page_size %u\n" , func, line, c->region->page_size);
@@ -658,7 +658,7 @@ static int dma_sb_region_create(struct pBUG_ON (!r);if (!r->dev->bus_id) { -pr_info ("%s:%d: %u:%u no dma\n" , __func__, __LINE__, +pr_info ("%s:%d: %lu:%lu no dma\n" , __func__, __LINE__, r->dev->bus_id, r->dev->dev_id);return 0 ; }
@@ -724,7 +724,7 @@ static int dma_sb_region_free(struct ps3BUG_ON (!r);if (!r->dev->bus_id) { -pr_info ("%s:%d: %u:%u no dma\n" , __func__, __LINE__, +pr_info ("%s:%d: %lu:%lu no dma\n" , __func__, __LINE__, r->dev->bus_id, r->dev->dev_id);return 0 ; }
arch/powerpc/platforms/ps3/platform.h +6 -6
@@ -95,7 +95,7 @@ enum ps3_dev_type {int ps3_repository_read_bus_str (unsigned int bus_index,const char *bus_str,u64 *value); -int ps3_repository_read_bus_id (unsigned int bus_index,unsigned int *bus_id); +int ps3_repository_read_bus_id (unsigned int bus_index,u64 *bus_id);int ps3_repository_read_bus_type (unsigned int bus_index,enum ps3_bus_type *bus_type); int ps3_repository_read_bus_num_dev(unsigned int bus_index,
@@ -119,7 +119,7 @@ enum ps3_reg_type {int ps3_repository_read_dev_str (unsigned int bus_index,unsigned int dev_index,const char *dev_str,u64 *value);int ps3_repository_read_dev_id (unsigned int bus_index,unsigned int dev_index, -unsigned int *dev_id); +u64 *dev_id);int ps3_repository_read_dev_type (unsigned int bus_index,unsigned int dev_index,enum ps3_dev_type *dev_type); int ps3_repository_read_dev_intr(unsigned int bus_index,
@@ -138,12 +138,12 @@ int ps3_repository_read_dev_reg(unsigned/* repository bus enumerators */ struct ps3_repository_device { -enum ps3_bus_type bus_type;unsigned int bus_index; -unsigned int bus_id; -enum ps3_dev_type dev_type;unsigned int dev_index; -unsigned int dev_id; +enum ps3_bus_type bus_type; +enum ps3_dev_type dev_type; +u64 bus_id; +u64 dev_id; }; static inline struct ps3_repository_device *ps3_repository_bump_device(
arch/powerpc/platforms/ps3/repository.c +8 -13
@@ -168,18 +168,15 @@ int ps3_repository_read_bus_str(unsigned value, 0); } -int ps3_repository_read_bus_id (unsigned int bus_index,unsigned int *bus_id) +int ps3_repository_read_bus_id (unsigned int bus_index,u64 *bus_id) {int result; -u64 v1; -u64 v2;/* unused */ result =read_node (PS3_LPAR_ID_PME ,make_first_field ("bus" , bus_index),make_field ("id" ,0 ),0 ,0 , - &v1, &v2); - *bus_id = v1; + bus_id,NULL );return result; }
@@ -225,18 +222,16 @@ int ps3_repository_read_dev_str(unsigned }int ps3_repository_read_dev_id (unsigned int bus_index,unsigned int dev_index, -unsigned int *dev_id) +u64 *dev_id) {int result; -u64 v1; result =read_node (PS3_LPAR_ID_PME ,make_first_field ("bus" , bus_index),make_field ("dev" , dev_index),make_field ("id" ,0 ),0 , - &v1,0 ); - *dev_id = v1; + dev_id,0 );return result; }
@@ -332,7 +327,7 @@ int ps3_repository_find_device(struct psreturn result; } -pr_debug ("%s:%d: bus_type %u, bus_index %u, bus_id %u, num_dev %u\n" , +pr_debug ("%s:%d: bus_type %u, bus_index %u, bus_id %lu, num_dev %u\n" , __func__, __LINE__, tmp.bus_type, tmp.bus_index, tmp.bus_id, num_dev);
@@ -387,7 +382,7 @@ int ps3_repository_find_device(struct psreturn result; } -pr_debug ("%s:%d: found: dev_type %u, dev_index %u, dev_id %u\n" , +pr_debug ("%s:%d: found: dev_type %u, dev_index %u, dev_id %lu\n" , __func__, __LINE__, tmp.dev_type, tmp.dev_index, tmp.dev_id); *repo = tmp;
@@ -1034,7 +1029,7 @@ static int dump_device_info(struct ps3_rcontinue ; } -pr_debug ("%s:%d (%u:%u): dev_type %u, dev_id %u\n" , __func__, +pr_debug ("%s:%d (%u:%u): dev_type %u, dev_id %lu\n" , __func__, __LINE__, repo->bus_index, repo->dev_index, repo->dev_type, repo->dev_id);
@@ -1091,7 +1086,7 @@ int ps3_repository_dump_bus_info(void)continue ; } -pr_debug ("%s:%d bus_%u: bus_type %u, bus_id %u, num_dev %u\n" , +pr_debug ("%s:%d bus_%u: bus_type %u, bus_id %lu, num_dev %u\n" , __func__, __LINE__, repo.bus_index, repo.bus_type, repo.bus_id, num_dev);
arch/powerpc/platforms/ps3/system-bus.c +7 -7
@@ -42,8 +42,8 @@ struct {int gpu; } static usage_hack; -static int ps3_is_device (struct ps3_system_bus_device *dev, -unsigned int bus_id,unsigned int dev_id) +static int ps3_is_device (struct ps3_system_bus_device *dev,u64 bus_id, +u64 dev_id) {return dev->bus_id == bus_id && dev->dev_id == dev_id; }
@@ -182,8 +182,8 @@ int ps3_open_hv_device(struct ps3_systemcase PS3_MATCH_ID_SYSTEM_MANAGER :pr_debug ("%s:%d: unsupported match_id: %u\n" , __func__, __LINE__, dev->match_id); -pr_debug ("%s:%d: bus_id: %u\n" , __func__, - __LINE__, dev->bus_id); +pr_debug ("%s:%d: bus_id: %lu\n" , __func__, __LINE__, + dev->bus_id);BUG ();return -EINVAL ;
@@ -220,8 +220,8 @@ int ps3_close_hv_device(struct ps3_systecase PS3_MATCH_ID_SYSTEM_MANAGER :pr_debug ("%s:%d: unsupported match_id: %u\n" , __func__, __LINE__, dev->match_id); -pr_debug ("%s:%d: bus_id: %u\n" , __func__, - __LINE__, dev->bus_id); +pr_debug ("%s:%d: bus_id: %lu\n" , __func__, __LINE__, + dev->bus_id);BUG ();return -EINVAL ;
@@ -240,7 +240,7 @@ EXPORT_SYMBOL_GPL(ps3_close_hv_device);static void _dump_mmio_region (const struct ps3_mmio_region * r,const char * func,int line) { -pr_debug ("%s:%d: dev %u:%u\n" , func, line, r->dev->bus_id, +pr_debug ("%s:%d: dev %lu:%lu\n" , func, line, r->dev->bus_id, r->dev->dev_id);pr_debug ("%s:%d: bus_addr %lxh\n" , func, line, r->bus_addr);pr_debug ("%s:%d: len %lxh\n" , func, line, r->len);
drivers/net/ps3_gelic_net.c +2 -2
@@ -58,11 +58,11 @@ static inline struct device *ctodev(stru {return &card->dev->core; } -static inline unsigned int bus_id (struct gelic_net_card *card) +static inline u64 bus_id (struct gelic_net_card *card) {return card->dev->bus_id; } -static inline unsigned int dev_id (struct gelic_net_card *card) +static inline u64 dev_id (struct gelic_net_card *card) {return card->dev->dev_id; }
include/asm-powerpc/ps3.h +2 -2
@@ -344,8 +344,8 @@ struct ps3_system_bus_device {enum ps3_match_id match_id;enum ps3_system_bus_device_type dev_type; -unsigned int bus_id;/* SB */ -unsigned int dev_id;/* SB */ +u64 bus_id;/* SB */ +u64 dev_id;/* SB */ unsigned int interrupt_id;/* SB */ struct ps3_dma_region *d_region;/* SB, IOC0 */ struct ps3_mmio_region *m_region;/* SB, IOC0*/
PATCH 3/16 PS3: Add ps3_repository_find_device_by_id()
In reply to a message not in the archiveFrom: Geert Uytterhoeven <[email protected]>
The storage probe feature of the PS3 hypervisor returns device IDs. Add the corresponding repository routine ps3_repository_find_device_by_id() which can be used to retrieve the device info from the repository.
--- arch/powerpc/platforms/ps3/platform.h | 2 arch/powerpc/platforms/ps3/repository.c | 77 ++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+)
arch/powerpc/platforms/ps3/platform.h +2 -0
@@ -153,6 +153,8 @@ static inline struct ps3_repository_devireturn repo; }int ps3_repository_find_device (struct ps3_repository_device *repo); +int ps3_repository_find_device_by_id (struct ps3_repository_device *repo, +u64 bus_id,u64 dev_id);int ps3_repository_find_devices (enum ps3_bus_type bus_type,int (*callback)(const struct ps3_repository_device *repo)); int ps3_repository_find_bus(enum ps3_bus_type bus_type, unsigned int from,
arch/powerpc/platforms/ps3/repository.c +77 -0
83 lines not on this page · raw message
PATCH 4/16 PS3: Use the HVs storage device notification mechanism properly
In reply to a message not in the archiveFrom: Geert Uytterhoeven <[email protected]>
The PS3 hypervisor has a storage device notification mechanism to wait until a storage device is ready. Unfortunately the storage device probing code used this mechanism in an incorrect way, needing a polling loop and handling of devices that are not yet ready.
This change corrects this by:
- First waiting for the reception of an asynchronous notification that a new storage device became ready,
- Then looking up the storage device in the device repository.
On shutdown, the storage probe thread is stopped and the storage notification device is closed using a reboot notifier.
--- arch/powerpc/platforms/ps3/device-init.c | 422 ++++++++++++++++--------------- arch/powerpc/platforms/ps3/platform.h | 2 arch/powerpc/platforms/ps3/repository.c | 29 -- 3 files changed, 221 insertions(+), 232 deletions(-)
arch/powerpc/platforms/ps3/device-init.c +221 -201
@@ -23,6 +23,7 @@#include <linux/kernel.h> #include <linux/kthread.h> #include <linux/init.h> +#include <linux/reboot.h> #include <asm/firmware.h> #include <asm/lv1call.h>
@@ -238,166 +239,6 @@ static int __init ps3_setup_vuart_devicereturn result; } -static int ps3stor_wait_for_completion (u64 dev_id,u64 tag, -unsigned int timeout) -{ -int result =-1 ; -unsigned int retries =0 ; -u64 status; - -for (retries =0 ; retries < timeout; retries++) { - result =lv1_storage_check_async_status (dev_id, tag, &status); -if (!result) -break ; - -msleep (1 ); - } - -if (result) -pr_debug ("%s:%u: check_async_status: %s, status %lx\n" , - __func__, __LINE__,ps3_result (result), status); - -return result; -} - -/** -* ps3_storage_wait_for_device - Wait for a storage device to become ready. -* @repo: The repository device to wait for. -* -* Uses the hypervisor's storage device notification mechanism to wait until -* a storage device is ready. The device notification mechanism uses a -* psuedo device (id = -1) to asynchronously notify the guest when storage -* devices become ready. The notification device has a block size of 512 -* bytes. -*/ - -static int ps3_storage_wait_for_device (const struct ps3_repository_device *repo) -{ -int error = -ENODEV ; -int result; -const u64 notification_dev_id = (u64)-1LL ; -const unsigned int timeout =HZ ; -u64 lpar; -u64 tag; -void *buf; -enum ps3_notify_type { - notify_device_ready =0 , - notify_region_probe =1 , - notify_region_update =2 , - }; -struct { -u64 operation_code;/* must be zero */ -u64 event_mask;/* OR of 1UL << enum ps3_notify_type */ - } *notify_cmd; -struct { -u64 event_type;/* enum ps3_notify_type */ -u64 bus_id; -u64 dev_id; -u64 dev_type; -u64 dev_port; - } *notify_event; - -pr_debug (" -> %s:%u: (%lu:%lu:%u)\n" , __func__, __LINE__, repo->bus_id, - repo->dev_id, repo->dev_type); - - buf =kzalloc (512 ,GFP_KERNEL ); -if (!buf) -return -ENOMEM ; - - lpar =ps3_mm_phys_to_lpar (__pa (buf)); - notify_cmd = buf; - notify_event = buf; - - result =lv1_open_device (repo->bus_id, notification_dev_id,0 ); -if (result) { -printk (KERN_ERR "%s:%u: lv1_open_device %s\n" , __func__, - __LINE__,ps3_result (result)); - goto fail_free; - } - -/* Setup and write the request for device notification. */ - - notify_cmd->operation_code =0 ;/* must be zero */ - notify_cmd->event_mask =1UL << notify_region_probe; - - result =lv1_storage_write (notification_dev_id,0 ,0 ,1 ,0 , lpar, - &tag); -if (result) { -printk (KERN_ERR "%s:%u: write failed %s\n" , __func__, __LINE__, -ps3_result (result)); - goto fail_close; - } - -/* Wait for the write completion */ - - result =ps3stor_wait_for_completion (notification_dev_id, tag, - timeout); -if (result) { -printk (KERN_ERR "%s:%u: write not completed %s\n" , __func__, - __LINE__,ps3_result (result)); - goto fail_close; - } - -/* Loop here processing the requested notification events. */ - -while (1 ) { -memset (notify_event,0 ,sizeof (*notify_event)); - - result =lv1_storage_read (notification_dev_id,0 ,0 ,1 ,0 , - lpar, &tag); -if (result) { -printk (KERN_ERR "%s:%u: write failed %s\n" , __func__, - __LINE__,ps3_result (result)); -break ; - } - - result =ps3stor_wait_for_completion (notification_dev_id, tag, - timeout); -if (result) { -printk (KERN_ERR "%s:%u: read not completed %s\n" , - __func__, __LINE__,ps3_result (result)); -break ; - } - -pr_debug ("%s:%d: notify event (%u:%u:%u): event_type 0x%lx, " -"port %lu\n" , __func__, __LINE__, repo->bus_index, - repo->dev_index, repo->dev_type, - notify_event->event_type, notify_event->dev_port); - -if (notify_event->event_type != notify_region_probe || - notify_event->bus_id != repo->bus_id) { -pr_debug ("%s:%u: bad notify_event: event %lu, " -"dev_id %lu, dev_type %lu\n" , - __func__, __LINE__, notify_event->event_type, - notify_event->dev_id, notify_event->dev_type); -break ; - } - -if (notify_event->dev_id == repo->dev_id && - notify_event->dev_type == repo->dev_type) { -pr_debug ("%s:%u: device ready (%u:%u:%u)\n" , __func__, - __LINE__, repo->bus_index, repo->dev_index, - repo->dev_type); - error =0 ; -break ; - } - -if (notify_event->dev_id == repo->dev_id && - notify_event->dev_type ==PS3_DEV_TYPE_NOACCESS ) { -pr_debug ("%s:%u: no access: dev_id %lu\n" , __func__, - __LINE__, repo->dev_id); -break ; - } - } - -fail_close: -lv1_close_device (repo->bus_id, notification_dev_id); -fail_free: -kfree (buf); -pr_debug (" <- %s:%u\n" , __func__, __LINE__); -return error; -} -static int ps3_setup_storage_dev (const struct ps3_repository_device *repo,enum ps3_match_id match_id) {
@@ -449,16 +290,6 @@ static int ps3_setup_storage_dev(const s goto fail_find_interrupt; } -/* FIXME: Arrange to only do this on a 'cold' boot */ - - result =ps3_storage_wait_for_device (repo); -if (result) { -printk (KERN_ERR "%s:%u: storage_notification failed %d\n" , - __func__, __LINE__, result); - result = -ENODEV ; - goto fail_probe_notification; - } -for (i =0 ; i < num_regions; i++) {unsigned int id;u64 start, size;
@@ -494,7 +325,6 @@ static int ps3_setup_storage_dev(const s fail_device_register: fail_read_region: -fail_probe_notification: fail_find_interrupt:kfree (p); fail_malloc:
@@ -659,62 +489,248 @@ static int ps3_register_repository_devicreturn result; } + +#define PS3_NOTIFICATION_DEV_ID ULONG_MAX +#define PS3_NOTIFICATION_INTERRUPT_ID 0 + +struct ps3_notification_device { +struct ps3_system_bus_device sbd; +spinlock_t lock; +u64 tag; +u64 lv1_status; +struct completion done; +}; + +enum ps3_notify_type { + notify_device_ready =0 , + notify_region_probe =1 , + notify_region_update =2 , +}; + +struct ps3_notify_cmd { +u64 operation_code;/* must be zero */ +u64 event_mask;/* OR of 1UL << enum ps3_notify_type */ +}; + +struct ps3_notify_event { +u64 event_type;/* enum ps3_notify_type */ +u64 bus_id; +u64 dev_id; +u64 dev_type; +u64 dev_port; +}; + +static irqreturn_t ps3_notification_interrupt (int irq,void *data) +{ +struct ps3_notification_device *dev = data; +int res; +u64 tag, status; + +spin_lock (&dev->lock); + res =lv1_storage_get_async_status (PS3_NOTIFICATION_DEV_ID , &tag, + &status); +if (tag != dev->tag) +pr_err ("%s:%u: tag mismatch, got %lx, expected %lx\n" , + __func__, __LINE__, tag, dev->tag); + +if (res) { +pr_err ("%s:%u: res %d status 0x%lx\n" , __func__, __LINE__, res, + status); + }else { +pr_debug ("%s:%u: completed, status 0x%lx\n" , __func__, + __LINE__, status); + dev->lv1_status = status; +complete (&dev->done); + } +spin_unlock (&dev->lock); +return IRQ_HANDLED ; +} + +static int ps3_notification_read_write (struct ps3_notification_device *dev, +u64 lpar,int write) +{ +const char *op = write ?"write" :"read" ; +unsigned long flags; +int res; + +init_completion (&dev->done); +spin_lock_irqsave (&dev->lock, flags); + res = write ?lv1_storage_write (dev->sbd.dev_id,0 ,0 ,1 ,0 , lpar, + &dev->tag) + :lv1_storage_read (dev->sbd.dev_id,0 ,0 ,1 ,0 , lpar, + &dev->tag); +spin_unlock_irqrestore (&dev->lock, flags); +if (res) { +pr_err ("%s:%u: %s failed %d\n" , __func__, __LINE__, op, res); +return -EPERM ; + } +pr_debug ("%s:%u: notification %s issued\n" , __func__, __LINE__, op); + + res =wait_event_interruptible (dev->done.wait, + dev->done.done ||kthread_should_stop ()); +if (kthread_should_stop ()) + res = -EINTR ; +if (res) { +pr_debug ("%s:%u: interrupted %s\n" , __func__, __LINE__, op); +return res; + } + +if (dev->lv1_status) { +pr_err ("%s:%u: %s not completed, status 0x%lx\n" , __func__, + __LINE__, op, dev->lv1_status); +return -EIO ; + } +pr_debug ("%s:%u: notification %s completed\n" , __func__, __LINE__, op); + +return 0 ; +} + +static struct task_struct *probe_task; +/** * ps3_probe_thread - Background repository probing at system startup. * * This implementation only supports background probing on a single bus. +* It uses the hypervisor's storage device notification mechanism to wait until +* a storage device is ready. The device notification mechanism uses a +* pseudo device to asynchronously notify the guest when storage devices become +* ready. The notification device has a block size of 512 bytes. */ static int ps3_probe_thread (void *data) { -struct ps3_repository_device *repo = data; -int result; -unsigned int ms =250 ; +struct ps3_notification_device dev; +struct ps3_repository_device repo; +int res; +unsigned int irq; +u64 lpar; +void *buf; +struct ps3_notify_cmd *notify_cmd; +struct ps3_notify_event *notify_event;pr_debug (" -> %s:%u: kthread started\n" , __func__, __LINE__); -do { -try_to_freeze (); + buf =kzalloc (512 ,GFP_KERNEL ); +if (!buf) +return -ENOMEM ; -pr_debug ("%s:%u: probing...\n" , __func__, __LINE__); + lpar =ps3_mm_phys_to_lpar (__pa (buf)); + notify_cmd = buf; + notify_event = buf; -do { - result =ps3_repository_find_device (repo); +/* dummy system bus device */ + dev.sbd.bus_id = (u64 )data; + dev.sbd.dev_id =PS3_NOTIFICATION_DEV_ID ; + dev.sbd.interrupt_id =PS3_NOTIFICATION_INTERRUPT_ID ; + + res =lv1_open_device (dev.sbd.bus_id, dev.sbd.dev_id,0 ); +if (res) { +pr_err ("%s:%u: lv1_open_device failed %s\n" , __func__, + __LINE__,ps3_result (res)); + goto fail_free; + } -if (result == -ENODEV ) -pr_debug ("%s:%u: nothing new\n" , __func__, - __LINE__); -else if (result) -pr_debug ("%s:%u: find device error.\n" , - __func__, __LINE__); -else { -pr_debug ("%s:%u: found device (%u:%u:%u)\n" , - __func__, __LINE__, repo->bus_index, - repo->dev_index, repo->dev_type); -ps3_register_repository_device (repo); -ps3_repository_bump_device (repo); - ms =250 ; - } - }while (!result); + res =ps3_sb_event_receive_port_setup (&dev.sbd,PS3_BINDING_CPU_ANY , + &irq); +if (res) { +pr_err ("%s:%u: ps3_sb_event_receive_port_setup failed %d\n" , + __func__, __LINE__, res); + goto fail_close_device; + } + +spin_lock_init (&dev.lock); + + res =request_irq (irq, ps3_notification_interrupt,IRQF_DISABLED , +"ps3_notification" , &dev); +if (res) { +pr_err ("%s:%u: request_irq failed %d\n" , __func__, __LINE__, + res); + goto fail_sb_event_receive_port_destroy; + } -pr_debug ("%s:%u: ms %u\n" , __func__, __LINE__, ms); +/* Setup and write the request for device notification. */ + notify_cmd->operation_code =0 ;/* must be zero */ + notify_cmd->event_mask =1UL << notify_region_probe; -if ( ms >60000 ) + res =ps3_notification_read_write (&dev, lpar,1 ); +if (res) + goto fail_free_irq; + +/* Loop here processing the requested notification events. */ +do { +try_to_freeze (); + +memset (notify_event,0 ,sizeof (*notify_event)); + + res =ps3_notification_read_write (&dev, lpar,0 ); +if (res)break ; -msleep_interruptible (ms); +pr_debug ("%s:%u: notify event type 0x%lx bus id %lu dev id %lu" +" type %lu port %lu\n" , __func__, __LINE__, + notify_event->event_type, notify_event->bus_id, + notify_event->dev_id, notify_event->dev_type, + notify_event->dev_port); -/* An exponential backoff. */ - ms <<=1 ; +if (notify_event->event_type != notify_region_probe || + notify_event->bus_id != dev.sbd.bus_id) { +pr_warning ("%s:%u: bad notify_event: event %lu, " +"dev_id %lu, dev_type %lu\n" , + __func__, __LINE__, notify_event->event_type, + notify_event->dev_id, + notify_event->dev_type); +continue ; + } + + res =ps3_repository_find_device_by_id (&repo, dev.sbd.bus_id, + notify_event->dev_id); +if (res) { +pr_warning ("%s:%u: device %lu:%lu not found\n" , + __func__, __LINE__, dev.sbd.bus_id, + notify_event->dev_id); +continue ; + } + +pr_debug ("%s:%u: device %lu:%lu found\n" , __func__, __LINE__, + dev.sbd.bus_id, notify_event->dev_id); +ps3_register_repository_device (&repo); }while (!kthread_should_stop ()); +fail_free_irq: +free_irq (irq, &dev); +fail_sb_event_receive_port_destroy: +ps3_sb_event_receive_port_destroy (&dev.sbd, irq); +fail_close_device: +lv1_close_device (dev.sbd.bus_id, dev.sbd.dev_id); +fail_free: +kfree (buf); + + probe_task =NULL ; +pr_debug (" <- %s:%u: kthread finished\n" , __func__, __LINE__);return 0 ; }/** +* ps3_stop_probe_thread - Stops the background probe thread. +* +*/ + +static int ps3_stop_probe_thread (struct notifier_block *nb,unsigned long code, +void *data) +{ +if (probe_task) +kthread_stop (probe_task); +return 0 ; +} + +static struct notifier_block nb = { + .notifier_call = ps3_stop_probe_thread +}; + +/** * ps3_start_probe_thread - Starts the background probe thread. * */
@@ -723,7 +739,7 @@ static int __init ps3_start_probe_thread {int result;struct task_struct *task; -static struct ps3_repository_device repo;/* must be static */ +struct ps3_repository_device repo;pr_debug (" -> %s:%d\n" , __func__, __LINE__);
@@ -746,7 +762,8 @@ static int __init ps3_start_probe_threadreturn -ENODEV ; } - task =kthread_run (ps3_probe_thread, &repo,"ps3-probe-%u" , bus_type); + task =kthread_run (ps3_probe_thread, (void *)repo.bus_id, +"ps3-probe-%u" , bus_type);if (IS_ERR (task)) { result =PTR_ERR (task);
@@ -755,6 +772,9 @@ static int __init ps3_start_probe_threadreturn result; } + probe_task = task; +register_reboot_notifier (&nb); +pr_debug (" <- %s:%d\n" , __func__, __LINE__);return 0 ; }
arch/powerpc/platforms/ps3/platform.h +0 -2
@@ -89,8 +89,6 @@ enum ps3_dev_type {PS3_DEV_TYPE_STOR_ROM =TYPE_ROM ,/* 5 */ PS3_DEV_TYPE_SB_GPIO =6 , PS3_DEV_TYPE_STOR_FLASH = TYPE_RBC, /* 14 */ -PS3_DEV_TYPE_STOR_DUMMY =32 , - PS3_DEV_TYPE_NOACCESS = 255, }; int ps3_repository_read_bus_str(unsigned int bus_index, const char *bus_str,
arch/powerpc/platforms/ps3/repository.c +0 -29
@@ -344,35 +344,6 @@ int ps3_repository_find_device(struct psreturn result; } -if (tmp.bus_type ==PS3_BUS_TYPE_STORAGE ) { -/* -* A storage device may show up in the repository before the -* hypervisor has finished probing its type and regions -*/ -unsigned int num_regions; - -if (tmp.dev_type ==PS3_DEV_TYPE_STOR_DUMMY ) { -pr_debug ("%s:%u storage device not ready\n" , __func__, - __LINE__); -return -ENODEV ; - } - - result =ps3_repository_read_stor_dev_num_regions (tmp.bus_index, - tmp.dev_index, - &num_regions); -if (result) { -pr_debug ("%s:%d read_stor_dev_num_regions failed\n" , - __func__, __LINE__); -return result; - } - -if (!num_regions) { -pr_debug ("%s:%u storage device has no regions yet\n" , - __func__, __LINE__); -return -ENODEV ; - } - } - result =ps3_repository_read_dev_id (tmp.bus_index, tmp.dev_index, &tmp.dev_id);
PATCH 5/16 PS3: Add repository polling loop to work around timing bug
In reply to a message not in the archiveFrom: Geert Uytterhoeven <[email protected]>
PS3: Add repository polling loop to work around timing bug
On some firmware versions (e.g. 1.90), the storage device may not show up in the repository immediately after receiving the notification message. Add a small polling loop to make sure we don't miss it.
--- arch/powerpc/platforms/ps3/device-init.c | 46 ++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 13 deletions(-)
arch/powerpc/platforms/ps3/device-init.c +33 -13
@@ -489,6 +489,38 @@ static int ps3_register_repository_devicreturn result; } +static void ps3_find_and_add_device (u64 bus_id,u64 dev_id) +{ +struct ps3_repository_device repo; +int res; +unsigned int retries; +unsigned long rem; + +/* +* On some firmware versions (e.g. 1.90), the device may not show up +* in the repository immediately +*/ +for (retries =0 ; retries <10 ; retries++) { + res =ps3_repository_find_device_by_id (&repo, bus_id, dev_id); +if (!res) + goto found; + + rem =msleep_interruptible (100 ); +if (rem) +break ; + } +pr_warning ("%s:%u: device %lu:%lu not found\n" , __func__, __LINE__, + bus_id, dev_id); +return ; + +found: +if (retries) +pr_debug ("%s:%u: device %lu:%lu found after %u retries\n" , + __func__, __LINE__, bus_id, dev_id, retries); + +ps3_register_repository_device (&repo); +return ; +}#define PS3_NOTIFICATION_DEV_ID ULONG_MAX#define PS3_NOTIFICATION_INTERRUPT_ID 0
@@ -600,7 +632,6 @@ static struct task_struct *probe_task;static int ps3_probe_thread (void *data) {struct ps3_notification_device dev; -struct ps3_repository_device repo;int res;unsigned int irq;u64 lpar;
@@ -682,18 +713,7 @@ static int ps3_probe_thread(void *data)continue ; } - res =ps3_repository_find_device_by_id (&repo, dev.sbd.bus_id, - notify_event->dev_id); -if (res) { -pr_warning ("%s:%u: device %lu:%lu not found\n" , - __func__, __LINE__, dev.sbd.bus_id, - notify_event->dev_id); -continue ; - } - -pr_debug ("%s:%u: device %lu:%lu found\n" , __func__, __LINE__, - dev.sbd.bus_id, notify_event->dev_id); -ps3_register_repository_device (&repo); +ps3_find_and_add_device (dev.sbd.bus_id, notify_event->dev_id); }while (!kthread_should_stop ());
PATCH 6/16 PS3: Kill unused ps3_repository_bump_device()
In reply to a message not in the archiveFrom: Geert Uytterhoeven <[email protected]>
PS3: Kill unused routine ps3_repository_bump_device().
--- arch/powerpc/platforms/ps3/platform.h | 6 ------ 1 files changed, 6 deletions(-)
arch/powerpc/platforms/ps3/platform.h +0 -6
@@ -144,12 +144,6 @@ struct ps3_repository_device {u64 dev_id; }; -static inline struct ps3_repository_device *ps3_repository_bump_device ( -struct ps3_repository_device *repo) -{ - repo->dev_index++; -return repo; -}int ps3_repository_find_device (struct ps3_repository_device *repo);int ps3_repository_find_device_by_id (struct ps3_repository_device *repo,u64 bus_id,u64 dev_id);
PATCH 7/16 PS3: Refactor ps3_repository_find_device()
In reply to a message not in the archiveFrom: Geert Uytterhoeven <[email protected]>
PS3: Refactor ps3_repository_find_device() to use the existing ps3_repository_read_bus_id() routine.
--- arch/powerpc/platforms/ps3/repository.c | 60 +++++++++++--------------------- 1 files changed, 22 insertions(+), 38 deletions(-)
arch/powerpc/platforms/ps3/repository.c +22 -38
@@ -445,50 +445,34 @@ int __devinit ps3_repository_find_devicepr_debug (" -> %s:%d: find bus_type %u\n" , __func__, __LINE__, bus_type); -for (repo.bus_index =0 ; repo.bus_index <10 ; repo.bus_index++) { + repo.bus_type = bus_type; + result =ps3_repository_find_bus (repo.bus_type,0 , &repo.bus_index); +if (result) { +pr_debug (" <- %s:%u: bus not found\n" , __func__, __LINE__); +return result; + } - result =ps3_repository_read_bus_type (repo.bus_index, - &repo.bus_type); + result =ps3_repository_read_bus_id (repo.bus_index, &repo.bus_id); +if (result) { +pr_debug ("%s:%d read_bus_id(%u) failed\n" , __func__, __LINE__, + repo.bus_index); +return result; + } -if (result) { -pr_debug ("%s:%d read_bus_type(%u) failed\n" , - __func__, __LINE__, repo.bus_index); +for (repo.dev_index =0 ; ; repo.dev_index++) { + result =ps3_repository_find_device (&repo); +if (result == -ENODEV ) { + result =0 ; +break ; + }else if (result)break ; - } - -if (repo.bus_type != bus_type) { -pr_debug ("%s:%d: skip, bus_type %u\n" , __func__, - __LINE__, repo.bus_type); -continue ; - } - - result =ps3_repository_read_bus_id (repo.bus_index, - &repo.bus_id); + result =callback (&repo);if (result) { -pr_debug ("%s:%d read_bus_id(%u) failed\n" , - __func__, __LINE__, repo.bus_index); -continue ; - } - -for (repo.dev_index =0 ; ; repo.dev_index++) { - result =ps3_repository_find_device (&repo); - -if (result == -ENODEV ) { - result =0 ; -break ; - }else if (result) -break ; - - result =callback (&repo); - -if (result) { -pr_debug ("%s:%d: abort at callback\n" , __func__, - __LINE__); -break ; - } +pr_debug ("%s:%d: abort at callback\n" , __func__, + __LINE__); +break ; } -break ; }pr_debug (" <- %s:%d\n" , __func__, __LINE__);
PATCH 8/16 PS3: Checkpatch cleanups for drivers/ps3/ps3-sys-manager.c
In reply to a message not in the archiveFrom: Geert Uytterhoeven <[email protected]>
Cleanup coding errors in drivers/ps3/ps3-sys-manager.c as reported by checkpatch.
--- drivers/ps3/ps3-sys-manager.c | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-)
drivers/ps3/ps3-sys-manager.c +7 -7
@@ -452,7 +452,7 @@ static int ps3_sys_manager_handle_event(case PS3_SM_EVENT_THERMAL_ALERT :dev_dbg (&dev->core,"%s:%d: THERMAL_ALERT (zone %u)\n" , __func__, __LINE__, event.value); -printk (KERN_INFO "PS3 Thermal Alert Zone %u\n" , event.value); +pr_info ("PS3 Thermal Alert Zone %u\n" , event.value);break ;case PS3_SM_EVENT_THERMAL_CLEARED : dev_dbg(&dev->core, "%s:%d: THERMAL_CLEARED (zone %u)\n",
@@ -488,7 +488,7 @@ static int ps3_sys_manager_handle_cmd(st result =ps3_vuart_read (dev, &cmd,sizeof (cmd));BUG_ON (result &&"need to retry here" ); -if (result) +if (result)return result;if (cmd.version !=1 ) {
@@ -521,7 +521,7 @@ static int ps3_sys_manager_handle_msg(st result =ps3_vuart_read (dev, &header,sizeof (struct ps3_sys_manager_header )); -if (result) +if (result)return result;if (header.version !=1 ) {
@@ -589,9 +589,9 @@ static void ps3_sys_manager_final_power_ PS3_SM_WAKE_DEFAULT);ps3_sys_manager_send_request_shutdown (dev); -printk (KERN_EMERG "System Halted, OK to turn off power\n" ); +pr_emerg ("System Halted, OK to turn off power\n" ); -while (1 ) +while (1 )ps3_sys_manager_handle_msg (dev); }
@@ -626,9 +626,9 @@ static void ps3_sys_manager_final_restar PS3_SM_WAKE_DEFAULT);ps3_sys_manager_send_request_shutdown (dev); -printk (KERN_EMERG "System Halted, OK to turn off power\n" ); +pr_emerg ("System Halted, OK to turn off power\n" ); -while (1 ) +while (1 )ps3_sys_manager_handle_msg (dev); }
PATCH 9/16 PS3: Checkpatch cleanups for drivers/ps3/ps3-vuart.c
In reply to a message not in the archiveFrom: Geert Uytterhoeven <[email protected]>
Cleanup coding errors in drivers/ps3/ps3-vuart.c as reported by checkpatch.
--- drivers/ps3/ps3-vuart.c | 16 +++++++--------- 1 files changed, 7 insertions(+), 9 deletions(-)
drivers/ps3/ps3-vuart.c +7 -9
@@ -108,18 +108,18 @@ static struct ps3_vuart_port_priv *to_postruct ports_bmp {u64 status;u64 unused[3 ]; -} __attribute__ ((aligned (32 ))); +} __attribute__((aligned (32 )));#define dump_ports_bmp (_b) _dump_ports_bmp(_b, __func__, __LINE__)static void __maybe_unused _dump_ports_bmp ( -const struct ports_bmp * bmp,const char * func,int line) +const struct ports_bmp *bmp,const char *func,int line) {pr_debug ("%s:%d: ports_bmp: %016lxh\n" , func, line, bmp->status); }#define dump_port_params (_b) _dump_port_params(_b, __func__, __LINE__)static void __maybe_unused _dump_port_params (unsigned int port_number, -const char * func,int line) +const char *func,int line) {#if defined(DEBUG ) static const char *strings[] = {
@@ -363,7 +363,7 @@ int ps3_vuart_disable_interrupt_disconne*/ static int ps3_vuart_raw_write (struct ps3_system_bus_device *dev, -const void * buf,unsigned int bytes,unsigned long *bytes_written) +const void *buf,unsigned int bytes,unsigned long *bytes_written) {int result;struct ps3_vuart_port_priv *priv =to_port_priv (dev);
@@ -431,7 +431,7 @@ void ps3_vuart_clear_rx_bytes(struct ps3int result;struct ps3_vuart_port_priv *priv =to_port_priv (dev);u64 bytes_waiting; -void * tmp; +void *tmp; result =ps3_vuart_get_rx_bytes_waiting (dev, &bytes_waiting);
@@ -526,9 +526,8 @@ int ps3_vuart_write(struct ps3_system_bu lb =kmalloc (sizeof (struct list_buffer ) + bytes,GFP_KERNEL ); -if (!lb) { +if (!lb)return -ENOMEM ; - }memcpy (lb->data, buf, bytes); lb->head = lb->data;
@@ -926,9 +925,8 @@ static int ps3_vuart_bus_interrupt_get(vBUG_ON (vuart_bus_priv.use_count >2 ); -if (vuart_bus_priv.use_count !=1 ) { +if (vuart_bus_priv.use_count !=1 )return 0 ; - }BUG_ON (vuart_bus_priv.bmp);
PATCH 10/16 PS3: Checkpatch cleanups for arch/powerpc/platforms/ps3/repository.c
In reply to a message not in the archiveFrom: Geert Uytterhoeven <[email protected]>
Cleanup coding errors in arch/powerpc/platforms/ps3/repository.c as reported by sparse and checkpatch.
--- arch/powerpc/platforms/ps3/repository.c | 64 ++++++++++++++++---------------- 1 files changed, 32 insertions(+), 32 deletions(-)
arch/powerpc/platforms/ps3/repository.c +32 -32
@@ -33,7 +33,7 @@ enum ps3_lpar_id { };#define dump_field (_a, _b) _dump_field(_a, _b, __func__, __LINE__) -static void _dump_field (const char *hdr,u64 n,const char * func,int line) +static void _dump_field (const char *hdr,u64 n,const char *func,int line) {#if defined(DEBUG )char s[16 ];
@@ -50,8 +50,8 @@ static void _dump_field(const char *hdr,#define dump_node_name (_a, _b, _c, _d, _e) \ _dump_node_name(_a, _b, _c, _d, _e, __func__, __LINE__) -static void _dump_node_name (unsigned int lpar_id,u64 n1,u64 n2,u64 n3, -u64 n4,const char * func,int line) +static void _dump_node_name (unsigned int lpar_id,u64 n1,u64 n2,u64 n3, +u64 n4,const char *func,int line) {pr_debug ("%s:%d: lpar: %u\n" , func, line, lpar_id);_dump_field ("n1: " , n1, func, line);
@@ -63,7 +63,7 @@ static void _dump_node_name (unsigned in#define dump_node (_a, _b, _c, _d, _e, _f, _g) \ _dump_node(_a, _b, _c, _d, _e, _f, _g, __func__, __LINE__)static void _dump_node (unsigned int lpar_id,u64 n1,u64 n2,u64 n3,u64 n4, -u64 v1,u64 v2,const char * func,int line) +u64 v1,u64 v2,const char *func,int line) {pr_debug ("%s:%d: lpar: %u\n" , func, line, lpar_id);_dump_field ("n1: " , n1, func, line);
@@ -165,7 +165,7 @@ int ps3_repository_read_bus_str(unsignedmake_first_field ("bus" , bus_index),make_field (bus_str,0 ),0 ,0 , - value, 0); + value, NULL); }int ps3_repository_read_bus_id (unsigned int bus_index,u64 *bus_id)
@@ -190,7 +190,7 @@ int ps3_repository_read_bus_type(unsignemake_first_field ("bus" , bus_index),make_field ("type" ,0 ),0 ,0 , - &v1, 0); + &v1, NULL); *bus_type = v1;return result; }
@@ -205,7 +205,7 @@ int ps3_repository_read_bus_num_dev(unsimake_first_field ("bus" , bus_index),make_field ("num_dev" ,0 ),0 ,0 , - &v1, 0); + &v1, NULL); *num_dev = v1;return result; }
@@ -218,7 +218,7 @@ int ps3_repository_read_dev_str(unsignedmake_field ("dev" , dev_index),make_field (dev_str,0 ),0 , - value, 0); + value, NULL); } int ps3_repository_read_dev_id(unsigned int bus_index, unsigned int dev_index,
@@ -231,7 +231,7 @@ int ps3_repository_read_dev_id(unsignedmake_field ("dev" , dev_index),make_field ("id" ,0 ),0 , - dev_id, 0); + dev_id, NULL);return result; }
@@ -246,14 +246,14 @@ int ps3_repository_read_dev_type(unsignemake_field ("dev" , dev_index),make_field ("type" ,0 ),0 , - &v1, 0); + &v1, NULL); *dev_type = v1;return result; }int ps3_repository_read_dev_intr (unsigned int bus_index,unsigned int dev_index,unsigned int intr_index, -enum ps3_interrupt_type *intr_type,unsigned int * interrupt_id) +enum ps3_interrupt_type *intr_type,unsigned int *interrupt_id) {int result;u64 v1;
@@ -282,7 +282,7 @@ int ps3_repository_read_dev_reg_type(unsmake_field ("dev" , dev_index),make_field ("reg" , reg_index),make_field ("type" ,0 ), - &v1, 0); + &v1, NULL); *reg_type = v1;return result; }
@@ -588,7 +588,7 @@ int ps3_repository_read_stor_dev_port(unmake_first_field ("bus" , bus_index),make_field ("dev" , dev_index),make_field ("port" ,0 ), - 0, port, 0); + 0, port, NULL); } int ps3_repository_read_stor_dev_blk_size(unsigned int bus_index,
@@ -598,7 +598,7 @@ int ps3_repository_read_stor_dev_blk_sizmake_first_field ("bus" , bus_index),make_field ("dev" , dev_index),make_field ("blk_size" ,0 ), - 0, blk_size, 0); + 0, blk_size, NULL); } int ps3_repository_read_stor_dev_num_blocks(unsigned int bus_index,
@@ -608,7 +608,7 @@ int ps3_repository_read_stor_dev_num_blomake_first_field ("bus" , bus_index),make_field ("dev" , dev_index),make_field ("n_blocks" ,0 ), - 0, num_blocks, 0); + 0, num_blocks, NULL); } int ps3_repository_read_stor_dev_num_regions(unsigned int bus_index,
@@ -621,7 +621,7 @@ int ps3_repository_read_stor_dev_num_regmake_first_field ("bus" , bus_index),make_field ("dev" , dev_index),make_field ("n_regs" ,0 ), - 0, &v1, 0); + 0, &v1, NULL); *num_regions = v1;return result; }
@@ -638,7 +638,7 @@ int ps3_repository_read_stor_dev_region_make_field ("dev" , dev_index),make_field ("region" , region_index),make_field ("id" ,0 ), - &v1, 0); + &v1, NULL); *region_id = v1;return result; }
@@ -651,7 +651,7 @@ int ps3_repository_read_stor_dev_region_make_field ("dev" , dev_index),make_field ("region" , region_index),make_field ("size" ,0 ), - region_size, 0); + region_size, NULL); } int ps3_repository_read_stor_dev_region_start(unsigned int bus_index,
@@ -662,7 +662,7 @@ int ps3_repository_read_stor_dev_region_make_field ("dev" , dev_index),make_field ("region" , region_index),make_field ("start" ,0 ), - region_start, 0); + region_start, NULL); } int ps3_repository_read_stor_dev_info(unsigned int bus_index,
@@ -718,7 +718,7 @@ int ps3_repository_read_rm_size(unsignedmake_field ("pu" ,0 ), ppe_id,make_field ("rm_size" ,0 ), - rm_size, 0); + rm_size, NULL); }int ps3_repository_read_region_total (u64 *region_total)
@@ -727,7 +727,7 @@ int ps3_repository_read_region_total(u64make_first_field ("bi" ,0 ),make_field ("rgntotal" ,0 ),0 ,0 , - region_total, 0); + region_total, NULL); }/**
@@ -763,7 +763,7 @@ int ps3_repository_read_num_spu_reservedmake_first_field ("bi" ,0 ),make_field ("spun" ,0 ),0 ,0 , - &v1, 0); + &v1, NULL); *num_spu_reserved = v1;return result; }
@@ -782,7 +782,7 @@ int ps3_repository_read_num_spu_resourcemake_first_field ("bi" ,0 ),make_field ("spursvn" ,0 ),0 ,0 , - &v1, 0); + &v1, NULL); *num_resource_id = v1;return result; }
@@ -795,7 +795,7 @@ int ps3_repository_read_num_spu_resource*/ int ps3_repository_read_spu_resource_id (unsigned int res_index, -enum ps3_spu_resource_type * resource_type,unsigned int *resource_id) +enum ps3_spu_resource_type *resource_type,unsigned int *resource_id) {int result;u64 v1;
@@ -812,14 +812,14 @@ int ps3_repository_read_spu_resource_id(return result; } -int ps3_repository_read_boot_dat_address (u64 *address) +static int ps3_repository_read_boot_dat_address (u64 *address) {return read_node (PS3_LPAR_ID_CURRENT ,make_first_field ("bi" ,0 ),make_field ("boot_dat" ,0 ),make_field ("address" ,0 ),0 , - address,0 ); + address,NULL ); }int ps3_repository_read_boot_dat_size (unsigned int *size)
@@ -832,7 +832,7 @@ int ps3_repository_read_boot_dat_size(unmake_field ("boot_dat" ,0 ),make_field ("size" ,0 ),0 , - &v1, 0); + &v1, NULL); *size = v1;return result; }
@@ -847,7 +847,7 @@ int ps3_repository_read_vuart_av_port(unmake_field ("vir_uart" ,0 ),make_field ("port" ,0 ),make_field ("avset" ,0 ), - &v1, 0); + &v1, NULL); *port = v1;return result; }
@@ -862,7 +862,7 @@ int ps3_repository_read_vuart_sysmgr_pormake_field ("vir_uart" ,0 ),make_field ("port" ,0 ),make_field ("sysmgr" ,0 ), - &v1, 0); + &v1, NULL); *port = v1;return result; }
@@ -893,7 +893,7 @@ int ps3_repository_read_num_be(unsigned0 ,0 ,0 , - &v1, 0); + &v1, NULL); *num_be = v1;return result; }
@@ -905,7 +905,7 @@ int ps3_repository_read_be_node_id(unsig0 ,0 ,0 , - node_id, 0); + node_id, NULL); }int ps3_repository_read_tb_freq (u64 node_id,u64 *tb_freq)
@@ -915,7 +915,7 @@ int ps3_repository_read_tb_freq(u64 node node_id,make_field ("clock" ,0 ),0 , - tb_freq, 0); + tb_freq, NULL); }int ps3_repository_read_be_tb_freq (unsigned int be_index,u64 *tb_freq)
PATCH 11/16 PS3: Add logical performance monitor repository routines
In reply to a message not in the archiveFrom: Takashi Yamamoto <[email protected]>
Add repository routines for the PS3 Logical Performance Monitor.
---
v2: o Correct Yamamoto-san's mail addr.
v3: o Change num_pu and pu_id to type u64.
o Add comments to describe some symbol names.
arch/powerpc/platforms/ps3/platform.h | 12 +++-- arch/powerpc/platforms/ps3/repository.c | 75 +++++++++++++++++++++++++++++++- 2 files changed, 83 insertions(+), 4 deletions(-)
arch/powerpc/platforms/ps3/platform.h +9 -3
@@ -180,10 +180,10 @@ int ps3_repository_read_stor_dev_region( unsigned int dev_index, unsigned int region_index, unsigned int *region_id, u64 *region_start, u64 *region_size); -/* repository pu and memory info */ +/* repository logical pu and memory info */ -int ps3_repository_read_num_pu (unsigned int *num_pu); -int ps3_repository_read_ppe_id (unsigned int *pu_index,unsigned int *ppe_id); +int ps3_repository_read_num_pu (u64 *num_pu); +int ps3_repository_read_pu_id (unsigned int pu_index,u64 *pu_id);int ps3_repository_read_rm_base (unsigned int ppe_id,u64 *rm_base);int ps3_repository_read_rm_size (unsigned int ppe_id,u64 *rm_size);int ps3_repository_read_region_total (u64 *region_total);
@@ -194,9 +194,15 @@ int ps3_repository_read_mm_info(u64 *rm_int ps3_repository_read_num_be (unsigned int *num_be);int ps3_repository_read_be_node_id (unsigned int be_index,u64 *node_id); +int ps3_repository_read_be_id (u64 node_id,u64 *be_id);int ps3_repository_read_tb_freq (u64 node_id,u64 *tb_freq);int ps3_repository_read_be_tb_freq (unsigned int be_index,u64 *tb_freq); +/* repository performance monitor info */ + +int ps3_repository_read_lpm_privileges (unsigned int be_index,u64 *lpar, +u64 *rights); +/* repository 'Other OS' area */ int ps3_repository_read_boot_dat_addr (u64 *lpar_addr);
arch/powerpc/platforms/ps3/repository.c +74 -1
109 lines not on this page · raw message
PATCH 12/16 PS3: Add logical performance monitor device support
In reply to a message not in the archiveAdd PS3 logical performance monitor device support to the PS3 system-bus and platform device registration routines.
---
v2: o Add enum ps3_lpm_tb_type.
o Remove redundant enclosing structure and return proper error codes from ps3_register_lpm_devices().
v3: o Add lpm.node_id to struct ps3_system_bus_device.
o Cleanup repository discovery logic.
arch/powerpc/platforms/ps3/device-init.c | 85 +++++++++++++++++++++++++++++++ arch/powerpc/platforms/ps3/system-bus.c | 5 + include/asm-powerpc/ps3.h | 8 ++ 3 files changed, 98 insertions(+) create mode 100644 arch/powerpc/platforms/ps3/lpm.c
arch/powerpc/platforms/ps3/device-init.c +85 -0
@@ -31,6 +31,89 @@#include "platform.h" +static int __init ps3_register_lpm_devices (void ) +{ +int result; +u64 tmp1; +u64 tmp2; +struct ps3_system_bus_device *dev; + +pr_debug (" -> %s:%d\n" , __func__, __LINE__); + + dev =kzalloc (sizeof (*dev),GFP_KERNEL ); +if (!dev) +return -ENOMEM ; + + dev->match_id =PS3_MATCH_ID_LPM ; + dev->dev_type =PS3_DEVICE_TYPE_LPM ; + +/* The current lpm driver only supports a single BE processor. */ + + result =ps3_repository_read_be_node_id (0 , &dev->lpm.node_id); + +if (result) { +pr_debug ("%s:%d: ps3_repository_read_be_node_id failed \n" , + __func__, __LINE__); + goto fail_read_repo; + } + + result =ps3_repository_read_lpm_privileges (dev->lpm.node_id, &tmp1, + &dev->lpm.rights); + +if (result) { +pr_debug ("%s:%d: ps3_repository_read_lpm_privleges failed \n" , + __func__, __LINE__); + goto fail_read_repo; + } + +lv1_get_logical_partition_id (&tmp2); + +if (tmp1 != tmp2) { +pr_debug ("%s:%d: wrong lpar\n" , + __func__, __LINE__); + result = -ENODEV ; + goto fail_rights; + } + +if (!(dev->lpm.rights &PS3_LPM_RIGHTS_USE_LPM )) { +pr_debug ("%s:%d: don't have rights to use lpm\n" , + __func__, __LINE__); + result = -EPERM ; + goto fail_rights; + } + +pr_debug ("%s:%d: pu_id %lu, rights %lu(%lxh)\n" , + __func__, __LINE__, dev->lpm.pu_id, dev->lpm.rights, + dev->lpm.rights); + + result =ps3_repository_read_pu_id (0 , &dev->lpm.pu_id); + +if (result) { +pr_debug ("%s:%d: ps3_repository_read_pu_id failed \n" , + __func__, __LINE__); + goto fail_read_repo; + } + + result =ps3_system_bus_device_register (dev); + +if (result) { +pr_debug ("%s:%d ps3_system_bus_device_register failed\n" , + __func__, __LINE__); + goto fail_register; + } + +pr_debug (" <- %s:%d\n" , __func__, __LINE__); +return 0 ; + + +fail_register: +fail_rights: +fail_read_repo: +kfree (dev); +pr_debug (" <- %s:%d: failed\n" , __func__, __LINE__); +return result; +} +/** * ps3_setup_gelic_device - Setup and register a gelic device instance. *
@@ -827,6 +910,8 @@ static int __init ps3_register_devices(vps3_register_sound_devices (); +ps3_register_lpm_devices (); +pr_debug (" <- %s:%d\n" , __func__, __LINE__);return 0 ; }
arch/powerpc/platforms/ps3/system-bus.c +5 -0
@@ -715,6 +715,7 @@ int ps3_system_bus_device_register(strucstatic unsigned int dev_ioc0_count;static unsigned int dev_sb_count;static unsigned int dev_vuart_count; +static unsigned int dev_lpm_count;if (!dev->core.parent) dev->core.parent = &ps3_system_bus;
@@ -737,6 +738,10 @@ int ps3_system_bus_device_register(strucsnprintf (dev->core.bus_id,sizeof (dev->core.bus_id),"vuart_%02x" , ++dev_vuart_count);break ; +case PS3_DEVICE_TYPE_LPM : +snprintf (dev->core.bus_id,sizeof (dev->core.bus_id), +"lpm_%02x" , ++dev_lpm_count); +break ;default :BUG (); };
include/asm-powerpc/ps3.h +8 -0
@@ -317,6 +317,7 @@ enum ps3_match_id {PS3_MATCH_ID_STOR_FLASH =8 ,PS3_MATCH_ID_SOUND =9 ,PS3_MATCH_ID_GRAPHICS =10 , + PS3_MATCH_ID_LPM = 11, };#define PS3_MODULE_ALIAS_EHCI "ps3:1"
@@ -329,11 +330,13 @@ enum ps3_match_id {#define PS3_MODULE_ALIAS_STOR_FLASH "ps3:8"#define PS3_MODULE_ALIAS_SOUND "ps3:9"#define PS3_MODULE_ALIAS_GRAPHICS "ps3:10" +#define PS3_MODULE_ALIAS_LPM "ps3:11"enum ps3_system_bus_device_type {PS3_DEVICE_TYPE_IOC0 =1 ,PS3_DEVICE_TYPE_SB ,PS3_DEVICE_TYPE_VUART , +PS3_DEVICE_TYPE_LPM , };/**
@@ -350,6 +353,11 @@ struct ps3_system_bus_device {struct ps3_dma_region *d_region;/* SB, IOC0 */ struct ps3_mmio_region *m_region;/* SB, IOC0*/ unsigned int port_number;/* VUART */ +struct {/* LPM */ +u64 node_id; +u64 pu_id; +u64 rights; + } lpm;/* struct iommu_table *iommu_table; -- waiting for BenH's cleanups */ struct device core;
PATCH 13/16 PS3: Add logical performance monitor driver support
In reply to a message not in the archiveFrom: Takashi Yamamoto <[email protected]>
Add PS3 logical performance monitor (lpm) device driver.
The PS3's LV1 hypervisor provides a Logical Performance Monitor that abstracts the Cell processor's performance monitor features for use by guest operating systems.
---
v2: o Correct Yamamoto-san's mail addr.
o Text cleanups.
o Added more comments explaining lpm operation.
o Split SRPN_BKMK into separate patch.
o Use get_hard_smp_processor_id() in ps3_get_hw_thread_id().
o Split ps3_copy_trace_buffer() into ps3_lpm_copy_tb() and ps3_lpm_copy_tb_to_user().
o Replace mutex with atomic_t in ps3_lpm_open()/ps3_lpm_close().
o General cleanup of ps3_lpm_open()/ps3_lpm_close().
v3:
o Add BE node_id to struct lpm_priv.
o Change some dev_err() to dev_dbg().
o Fix kzalloc() bug.
o Text fix 'lost' -> 'loss'.
o Use lpm_priv->node_id with lv1_construct_lpm().
arch/powerpc/platforms/ps3/Kconfig | 13 drivers/ps3/Makefile | 1 drivers/ps3/ps3-lpm.c | 1248 +++++++++++++++++++++++++++++++++++++ include/asm-powerpc/ps3.h | 62 + 4 files changed, 1324 insertions(+) create mode 100644 arch/powerpc/platforms/ps3/ps3-lpm.c
arch/powerpc/platforms/ps3/Kconfig +13 -0
@@ -138,4 +138,17 @@ config PS3_FLASH be disabled on the kernel command line using "ps3flash=off", to not allocate this fixed buffer. +config PS3_LPM + tristate "PS3 Logical Performance Monitor support" + depends on PPC_PS3 + help + Include support for the PS3 Logical Performance Monitor. + + This support is required to use the logical performance monitor + of the PS3's LV1 hypervisor. + + If you intend to use the advanced performance monitoring and + profiling support of the Cell processor with programs like + oprofile and perfmon2, then say Y or M, otherwise say N. + endmenu
drivers/ps3/Makefile +1 -0
@@ -4,3 +4,4 @@ ps3av_mod-objs += ps3av.o ps3av_cmd.o obj-$(CONFIG_PPC_PS3) += sys-manager-core.o obj-$(CONFIG_PS3_SYS_MANAGER) += ps3-sys-manager.o obj-$(CONFIG_PS3_STORAGE) += ps3stor_lib.o +obj-$(CONFIG_PS3_LPM) += ps3-lpm.o
drivers/ps3/ps3-lpm.c new file +1248 -0
1,248 lines not on this page · raw message
include/asm-powerpc/ps3.h +62 -0
73 lines not on this page · raw message
PATCH 14/16 PS3: Vuart change semaphore to mutex
In reply to a message not in the archiveA general housekeeping change of the PS3 vuart variable vuart_bus_priv.probe_mutex from semaphore to mutex.
--- drivers/ps3/ps3-vuart.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)
drivers/ps3/ps3-vuart.c +11 -11
@@ -877,7 +877,7 @@ static int ps3_vuart_handle_port_interrustruct vuart_bus_priv {struct ports_bmp *bmp;unsigned int virq; -struct semaphore probe_mutex; +struct mutex probe_mutex;int use_count;struct ps3_system_bus_device *devices[PORT_COUNT ]; }static vuart_bus_priv;
@@ -1015,7 +1015,7 @@ static int ps3_vuart_probe(struct ps3_syreturn -EINVAL ; } -down (&vuart_bus_priv.probe_mutex); +mutex_lock (&vuart_bus_priv.probe_mutex); result =ps3_vuart_bus_interrupt_get ();
@@ -1076,7 +1076,7 @@ static int ps3_vuart_probe(struct ps3_sy goto fail_probe; } -up (&vuart_bus_priv.probe_mutex); +mutex_unlock (&vuart_bus_priv.probe_mutex);return result;
@@ -1089,7 +1089,7 @@ fail_dev_malloc: fail_busy:ps3_vuart_bus_interrupt_put (); fail_setup_interrupt: -up (&vuart_bus_priv.probe_mutex); +mutex_unlock (&vuart_bus_priv.probe_mutex);dev_dbg (&dev->core,"%s:%d: failed\n" , __func__, __LINE__);return result; }
@@ -1128,7 +1128,7 @@ static int ps3_vuart_remove(struct ps3_sBUG_ON (!dev); -down (&vuart_bus_priv.probe_mutex); +mutex_lock (&vuart_bus_priv.probe_mutex);dev_dbg (&dev->core," -> %s:%d: match_id %d\n" , __func__, __LINE__, dev->match_id);
@@ -1136,7 +1136,7 @@ static int ps3_vuart_remove(struct ps3_sif (!dev->core.driver) {dev_dbg (&dev->core,"%s:%d: no driver bound\n" , __func__, __LINE__); -up (&vuart_bus_priv.probe_mutex); +mutex_unlock (&vuart_bus_priv.probe_mutex);return 0 ; }
@@ -1159,7 +1159,7 @@ static int ps3_vuart_remove(struct ps3_s priv =NULL ;dev_dbg (&dev->core," <- %s:%d\n" , __func__, __LINE__); -up (&vuart_bus_priv.probe_mutex); +mutex_unlock (&vuart_bus_priv.probe_mutex);return 0 ; }
@@ -1179,7 +1179,7 @@ static int ps3_vuart_shutdown(struct ps3BUG_ON (!dev); -down (&vuart_bus_priv.probe_mutex); +mutex_lock (&vuart_bus_priv.probe_mutex);dev_dbg (&dev->core," -> %s:%d: match_id %d\n" , __func__, __LINE__, dev->match_id);
@@ -1187,7 +1187,7 @@ static int ps3_vuart_shutdown(struct ps3if (!dev->core.driver) {dev_dbg (&dev->core,"%s:%d: no driver bound\n" , __func__, __LINE__); -up (&vuart_bus_priv.probe_mutex); +mutex_unlock (&vuart_bus_priv.probe_mutex);return 0 ; }
@@ -1211,7 +1211,7 @@ static int ps3_vuart_shutdown(struct ps3dev_dbg (&dev->core," <- %s:%d\n" , __func__, __LINE__); -up (&vuart_bus_priv.probe_mutex); +mutex_unlock (&vuart_bus_priv.probe_mutex);return 0 ; }
@@ -1222,7 +1222,7 @@ static int __init ps3_vuart_bus_init(voiif (!firmware_has_feature (FW_FEATURE_PS3_LV1 ))return -ENODEV ; -init_MUTEX (&vuart_bus_priv.probe_mutex); +mutex_init (&vuart_bus_priv.probe_mutex);return 0 ; }
PATCH 15/16 PS3: Revove use lpar address workaround
In reply to a message not in the archiveRemove the PS3 workaround needed to support sparsemem SPU mappings. The SPU mappings no longer use sparsemem, so this workaround is no longer needed.
--- arch/powerpc/platforms/ps3/Kconfig | 11 ----------- arch/powerpc/platforms/ps3/mm.c | 16 ++++------------ include/asm-powerpc/sparsemem.h | 5 ----- 3 files changed, 4 insertions(+), 28 deletions(-)
arch/powerpc/platforms/ps3/Kconfig +0 -11
@@ -61,17 +61,6 @@ config PS3_DYNAMIC_DMA This support is mainly for Linux kernel development. If unsure, say N. -config PS3_USE_LPAR_ADDR - depends on PPC_PS3 && EXPERIMENTAL - bool "PS3 use lpar address space" - default y - help - This option is solely for experimentation by experts. Disables - translation of lpar addresses. SPE support currently won't work - without this set to y. - - If you have any doubt, choose the default y. - config PS3_VUART depends on PPC_PS3 tristate
arch/powerpc/platforms/ps3/mm.c +4 -12
@@ -36,11 +36,6 @@#endif enum { -#if defined(CONFIG_PS3_USE_LPAR_ADDR ) -USE_LPAR_ADDR =1 , -#else -USE_LPAR_ADDR =0 , -#endif #if defined(CONFIG_PS3_DYNAMIC_DMA )USE_DYNAMIC_DMA =1 ,#else
@@ -137,11 +132,8 @@ static struct map map;unsigned long ps3_mm_phys_to_lpar (unsigned long phys_addr) {BUG_ON (is_kernel_addr (phys_addr)); -if (USE_LPAR_ADDR ) -return phys_addr; -else -return (phys_addr < map.rm.size || phys_addr >= map.total) - ? phys_addr : phys_addr + map.r1.offset; +return (phys_addr < map.rm.size || phys_addr >= map.total) + ? phys_addr : phys_addr + map.r1.offset; }EXPORT_SYMBOL (ps3_mm_phys_to_lpar);
@@ -309,7 +301,7 @@ static int __init ps3_mm_add_memory(voidBUG_ON (!mem_init_done); - start_addr =USE_LPAR_ADDR ? map.r1.base : map.rm.size; + start_addr = map.rm.size; start_pfn = start_addr >>PAGE_SHIFT ; nr_pages = (map.r1.size +PAGE_SIZE -1 ) >>PAGE_SHIFT ;
@@ -1007,7 +999,7 @@ static int dma_sb_region_create_linear(sif (r->offset + r->len > map.rm.size) {/* Map (part of) 2nd RAM chunk */ - virt_addr =USE_LPAR_ADDR ? map.r1.base : map.rm.size; + virt_addr = map.rm.size; len = r->len;if (r->offset >= map.rm.size) virt_addr += r->offset - map.rm.size;
include/asm-powerpc/sparsemem.h +0 -5
@@ -10,13 +10,8 @@*/ #define SECTION_SIZE_BITS 24 -#if defined(CONFIG_PS3_USE_LPAR_ADDR ) -#define MAX_PHYSADDR_BITS 47 -#define MAX_PHYSMEM_BITS 47 -#else #define MAX_PHYSADDR_BITS 44#define MAX_PHYSMEM_BITS 44 -#endif #ifdef CONFIG_MEMORY_HOTPLUG extern void create_section_mapping (unsigned long start,unsigned long end);
PATCH 16/16 PS3: Update ps3_defconfig
In reply to a message not in the archiveUpdate ps3_defconfig.
--- arch/powerpc/configs/ps3_defconfig | 49 ++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 14 deletions(-)
arch/powerpc/configs/ps3_defconfig +35 -14
@@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.24-rc4 -# Tue Dec 4 22:49:57 2007 +# Linux kernel version: 2.6.24-rc8 +# Wed Jan 16 14:31:21 2008 # CONFIG_PPC64=y
@@ -103,6 +103,7 @@ CONFIG_VM_EVENT_COUNTERS=y CONFIG_SLAB=y # CONFIG_SLUB is not set # CONFIG_SLOB is not set +CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y # CONFIG_TINY_SHMEM is not set CONFIG_BASE_SMALL=0
@@ -154,7 +155,6 @@ CONFIG_PPC_PS3=y # CONFIG_PS3_ADVANCED is not set CONFIG_PS3_HTAB_SIZE=20 # CONFIG_PS3_DYNAMIC_DMA is not set -CONFIG_PS3_USE_LPAR_ADDR=y CONFIG_PS3_VUART=y CONFIG_PS3_PS3AV=y CONFIG_PS3_SYS_MANAGER=y
@@ -162,6 +162,7 @@ CONFIG_PS3_STORAGE=y CONFIG_PS3_DISK=y CONFIG_PS3_ROM=y CONFIG_PS3_FLASH=y +CONFIG_PS3_LPM=m CONFIG_PPC_CELL=y # CONFIG_PPC_CELL_NATIVE is not set # CONFIG_PPC_IBM_CELL_BLADE is not set
@@ -225,7 +226,7 @@ CONFIG_HAVE_MEMORY_PRESENT=y # CONFIG_SPARSEMEM_STATIC is not set CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y -CONFIG_SPARSEMEM_VMEMMAP=y +# CONFIG_SPARSEMEM_VMEMMAP is not set CONFIG_MEMORY_HOTPLUG=y CONFIG_MEMORY_HOTPLUG_SPARSE=y CONFIG_SPLIT_PTLOCK_CPUS=4
@@ -338,7 +339,26 @@ CONFIG_IPV6_SIT=y # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO is not set # CONFIG_IRDA is not set -# CONFIG_BT is not set +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_HIDP=m + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +CONFIG_BT_HCIUSB_SCO=y +# CONFIG_BT_HCIUART is not set +# CONFIG_BT_HCIBCM203X is not set +# CONFIG_BT_HCIBPA10X is not set +# CONFIG_BT_HCIBFUSB is not set +# CONFIG_BT_HCIVHCI is not set # CONFIG_AF_RXRPC is not set #
@@ -666,14 +686,14 @@ CONFIG_LOGO_LINUX_CLUT224=y # # Sound # -CONFIG_SOUND=y +CONFIG_SOUND=m # # Advanced Linux Sound Architecture # -CONFIG_SND=y -CONFIG_SND_TIMER=y -CONFIG_SND_PCM=y +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m # CONFIG_SND_SEQUENCER is not set # CONFIG_SND_MIXER_OSS is not set # CONFIG_SND_PCM_OSS is not set
@@ -702,7 +722,7 @@ CONFIG_SND_VERBOSE_PROCFS=y # # ALSA PowerPC devices # -CONFIG_SND_PS3=y +CONFIG_SND_PS3=m CONFIG_SND_PS3_DEFAULT_START_DELAY=2000 #
@@ -747,7 +767,7 @@ CONFIG_USB_SUPPORT=y CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_OHCI=y CONFIG_USB_ARCH_HAS_EHCI=y -CONFIG_USB=y +CONFIG_USB=m # CONFIG_USB_DEBUG is not set #
@@ -761,13 +781,13 @@ CONFIG_USB_DEVICEFS=y # # USB Host Controller Drivers # -CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_HCD=m # CONFIG_USB_EHCI_SPLIT_ISO is not set # CONFIG_USB_EHCI_ROOT_HUB_TT is not set # CONFIG_USB_EHCI_TT_NEWSCHED is not set CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y # CONFIG_USB_ISP116X_HCD is not set -CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_HCD=m # CONFIG_USB_OHCI_HCD_PPC_OF is not set # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
@@ -1033,7 +1053,8 @@ CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT=y CONFIG_HAS_DMA=y CONFIG_INSTRUMENTATION=y -# CONFIG_PROFILING is not set +CONFIG_PROFILING=y +CONFIG_OPROFILE=m # CONFIG_KPROBES is not set # CONFIG_MARKERS is not set