rsparser.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * pnpacpi -- PnP ACPI driver
  4. *
  5. * Copyright (c) 2004 Matthieu Castet <castet.matthieu@free.fr>
  6. * Copyright (c) 2004 Li Shaohua <shaohua.li@intel.com>
  7. * Copyright (C) 2008 Hewlett-Packard Development Company, L.P.
  8. * Bjorn Helgaas <bjorn.helgaas@hp.com>
  9. */
  10. #include <linux/kernel.h>
  11. #include <linux/acpi.h>
  12. #include <linux/pci.h>
  13. #include <linux/pnp.h>
  14. #include <linux/slab.h>
  15. #include "../base.h"
  16. #include "pnpacpi.h"
  17. static void decode_irq_flags(struct pnp_dev *dev, int flags, u8 *triggering,
  18. u8 *polarity, u8 *shareable)
  19. {
  20. switch (flags & (IORESOURCE_IRQ_LOWLEVEL | IORESOURCE_IRQ_HIGHLEVEL |
  21. IORESOURCE_IRQ_LOWEDGE | IORESOURCE_IRQ_HIGHEDGE)) {
  22. case IORESOURCE_IRQ_LOWLEVEL:
  23. *triggering = ACPI_LEVEL_SENSITIVE;
  24. *polarity = ACPI_ACTIVE_LOW;
  25. break;
  26. case IORESOURCE_IRQ_HIGHLEVEL:
  27. *triggering = ACPI_LEVEL_SENSITIVE;
  28. *polarity = ACPI_ACTIVE_HIGH;
  29. break;
  30. case IORESOURCE_IRQ_LOWEDGE:
  31. *triggering = ACPI_EDGE_SENSITIVE;
  32. *polarity = ACPI_ACTIVE_LOW;
  33. break;
  34. case IORESOURCE_IRQ_HIGHEDGE:
  35. *triggering = ACPI_EDGE_SENSITIVE;
  36. *polarity = ACPI_ACTIVE_HIGH;
  37. break;
  38. default:
  39. dev_err(&dev->dev, "can't encode invalid IRQ mode %#x\n",
  40. flags);
  41. *triggering = ACPI_EDGE_SENSITIVE;
  42. *polarity = ACPI_ACTIVE_HIGH;
  43. break;
  44. }
  45. if (flags & IORESOURCE_IRQ_SHAREABLE)
  46. *shareable = ACPI_SHARED;
  47. else
  48. *shareable = ACPI_EXCLUSIVE;
  49. }
  50. static int dma_flags(struct pnp_dev *dev, int type, int bus_master,
  51. int transfer)
  52. {
  53. int flags = 0;
  54. if (bus_master)
  55. flags |= IORESOURCE_DMA_MASTER;
  56. switch (type) {
  57. case ACPI_COMPATIBILITY:
  58. flags |= IORESOURCE_DMA_COMPATIBLE;
  59. break;
  60. case ACPI_TYPE_A:
  61. flags |= IORESOURCE_DMA_TYPEA;
  62. break;
  63. case ACPI_TYPE_B:
  64. flags |= IORESOURCE_DMA_TYPEB;
  65. break;
  66. case ACPI_TYPE_F:
  67. flags |= IORESOURCE_DMA_TYPEF;
  68. break;
  69. default:
  70. /* Set a default value ? */
  71. flags |= IORESOURCE_DMA_COMPATIBLE;
  72. dev_err(&dev->dev, "invalid DMA type %d\n", type);
  73. }
  74. switch (transfer) {
  75. case ACPI_TRANSFER_8:
  76. flags |= IORESOURCE_DMA_8BIT;
  77. break;
  78. case ACPI_TRANSFER_8_16:
  79. flags |= IORESOURCE_DMA_8AND16BIT;
  80. break;
  81. case ACPI_TRANSFER_16:
  82. flags |= IORESOURCE_DMA_16BIT;
  83. break;
  84. default:
  85. /* Set a default value ? */
  86. flags |= IORESOURCE_DMA_8AND16BIT;
  87. dev_err(&dev->dev, "invalid DMA transfer type %d\n", transfer);
  88. }
  89. return flags;
  90. }
  91. /*
  92. * Allocated Resources
  93. */
  94. static void pnpacpi_add_irqresource(struct pnp_dev *dev, struct resource *r)
  95. {
  96. if (!(r->flags & IORESOURCE_DISABLED))
  97. pcibios_penalize_isa_irq(r->start, 1);
  98. pnp_add_resource(dev, r);
  99. }
  100. /*
  101. * Device CSRs that do not appear in PCI config space should be described
  102. * via ACPI. This would normally be done with Address Space Descriptors
  103. * marked as "consumer-only," but old versions of Windows and Linux ignore
  104. * the producer/consumer flag, so HP invented a vendor-defined resource to
  105. * describe the location and size of CSR space.
  106. */
  107. static struct acpi_vendor_uuid hp_ccsr_uuid = {
  108. .subtype = 2,
  109. .data = { 0xf9, 0xad, 0xe9, 0x69, 0x4f, 0x92, 0x5f, 0xab, 0xf6, 0x4a,
  110. 0x24, 0xd2, 0x01, 0x37, 0x0e, 0xad },
  111. };
  112. static int vendor_resource_matches(struct pnp_dev *dev,
  113. struct acpi_resource_vendor_typed *vendor,
  114. struct acpi_vendor_uuid *match,
  115. int expected_len)
  116. {
  117. int uuid_len = sizeof(vendor->uuid);
  118. u8 uuid_subtype = vendor->uuid_subtype;
  119. u8 *uuid = vendor->uuid;
  120. int actual_len;
  121. /* byte_length includes uuid_subtype and uuid */
  122. actual_len = vendor->byte_length - uuid_len - 1;
  123. if (uuid_subtype == match->subtype &&
  124. uuid_len == sizeof(match->data) &&
  125. memcmp(uuid, match->data, uuid_len) == 0) {
  126. if (expected_len && expected_len != actual_len) {
  127. dev_err(&dev->dev,
  128. "wrong vendor descriptor size; expected %d, found %d bytes\n",
  129. expected_len, actual_len);
  130. return 0;
  131. }
  132. return 1;
  133. }
  134. return 0;
  135. }
  136. static void pnpacpi_parse_allocated_vendor(struct pnp_dev *dev,
  137. struct acpi_resource_vendor_typed *vendor)
  138. {
  139. struct { u64 start, length; } range;
  140. if (vendor_resource_matches(dev, vendor, &hp_ccsr_uuid,
  141. sizeof(range))) {
  142. memcpy(&range, vendor->byte_data, sizeof(range));
  143. pnp_add_mem_resource(dev, range.start, range.start +
  144. range.length - 1, 0);
  145. }
  146. }
  147. static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res,
  148. void *data)
  149. {
  150. struct pnp_dev *dev = data;
  151. struct acpi_resource_dma *dma;
  152. struct acpi_resource_vendor_typed *vendor_typed;
  153. struct acpi_resource_gpio *gpio;
  154. struct resource_win win = {{0}, 0};
  155. struct resource *r = &win.res;
  156. int i, flags;
  157. if (acpi_dev_resource_address_space(res, &win)
  158. || acpi_dev_resource_ext_address_space(res, &win)) {
  159. pnp_add_resource(dev, &win.res);
  160. return AE_OK;
  161. }
  162. r->flags = 0;
  163. if (acpi_dev_resource_interrupt(res, 0, r)) {
  164. pnpacpi_add_irqresource(dev, r);
  165. for (i = 1; acpi_dev_resource_interrupt(res, i, r); i++)
  166. pnpacpi_add_irqresource(dev, r);
  167. if (i > 1) {
  168. /*
  169. * The IRQ encoder puts a single interrupt in each
  170. * descriptor, so if a _CRS descriptor has more than
  171. * one interrupt, we won't be able to re-encode it.
  172. */
  173. if (pnp_can_write(dev)) {
  174. dev_warn(&dev->dev,
  175. "multiple interrupts in _CRS descriptor; configuration can't be changed\n");
  176. dev->capabilities &= ~PNP_WRITE;
  177. }
  178. }
  179. return AE_OK;
  180. } else if (acpi_gpio_get_irq_resource(res, &gpio)) {
  181. /*
  182. * If the resource is GpioInt() type then extract the IRQ
  183. * from GPIO resource and fill it into IRQ resource type.
  184. */
  185. i = acpi_dev_gpio_irq_get(dev->data, 0);
  186. if (i >= 0) {
  187. flags = acpi_dev_irq_flags(gpio->triggering,
  188. gpio->polarity,
  189. gpio->shareable,
  190. gpio->wake_capable);
  191. } else {
  192. flags = IORESOURCE_DISABLED;
  193. }
  194. pnp_add_irq_resource(dev, i, flags);
  195. return AE_OK;
  196. } else if (r->flags & IORESOURCE_DISABLED) {
  197. pnp_add_irq_resource(dev, 0, IORESOURCE_DISABLED);
  198. return AE_OK;
  199. }
  200. switch (res->type) {
  201. case ACPI_RESOURCE_TYPE_MEMORY24:
  202. case ACPI_RESOURCE_TYPE_MEMORY32:
  203. case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
  204. if (acpi_dev_resource_memory(res, r))
  205. pnp_add_resource(dev, r);
  206. break;
  207. case ACPI_RESOURCE_TYPE_IO:
  208. case ACPI_RESOURCE_TYPE_FIXED_IO:
  209. if (acpi_dev_resource_io(res, r))
  210. pnp_add_resource(dev, r);
  211. break;
  212. case ACPI_RESOURCE_TYPE_DMA:
  213. dma = &res->data.dma;
  214. if (dma->channel_count > 0 && dma->channels[0] != (u8) -1)
  215. flags = dma_flags(dev, dma->type, dma->bus_master,
  216. dma->transfer);
  217. else
  218. flags = IORESOURCE_DISABLED;
  219. pnp_add_dma_resource(dev, dma->channels[0], flags);
  220. break;
  221. case ACPI_RESOURCE_TYPE_START_DEPENDENT:
  222. case ACPI_RESOURCE_TYPE_END_DEPENDENT:
  223. break;
  224. case ACPI_RESOURCE_TYPE_VENDOR:
  225. vendor_typed = &res->data.vendor_typed;
  226. pnpacpi_parse_allocated_vendor(dev, vendor_typed);
  227. break;
  228. case ACPI_RESOURCE_TYPE_END_TAG:
  229. break;
  230. case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
  231. break;
  232. case ACPI_RESOURCE_TYPE_SERIAL_BUS:
  233. /* serial bus connections (I2C/SPI/UART) are not pnp */
  234. break;
  235. default:
  236. dev_warn(&dev->dev, "unknown resource type %d in _CRS\n",
  237. res->type);
  238. return AE_ERROR;
  239. }
  240. return AE_OK;
  241. }
  242. int pnpacpi_parse_allocated_resource(struct pnp_dev *dev)
  243. {
  244. struct acpi_device *acpi_dev = dev->data;
  245. acpi_handle handle = acpi_dev->handle;
  246. acpi_status status;
  247. pnp_dbg(&dev->dev, "parse allocated resources\n");
  248. pnp_init_resources(dev);
  249. status = acpi_walk_resources(handle, METHOD_NAME__CRS,
  250. pnpacpi_allocated_resource, dev);
  251. if (ACPI_FAILURE(status)) {
  252. if (status != AE_NOT_FOUND)
  253. dev_err(&dev->dev, "can't evaluate _CRS: %d", status);
  254. return -EPERM;
  255. }
  256. return 0;
  257. }
  258. static __init void pnpacpi_parse_dma_option(struct pnp_dev *dev,
  259. unsigned int option_flags,
  260. struct acpi_resource_dma *p)
  261. {
  262. int i;
  263. unsigned char map = 0, flags;
  264. for (i = 0; i < p->channel_count; i++)
  265. map |= 1 << p->channels[i];
  266. flags = dma_flags(dev, p->type, p->bus_master, p->transfer);
  267. pnp_register_dma_resource(dev, option_flags, map, flags);
  268. }
  269. static __init void pnpacpi_parse_irq_option(struct pnp_dev *dev,
  270. unsigned int option_flags,
  271. struct acpi_resource_irq *p)
  272. {
  273. int i;
  274. pnp_irq_mask_t map;
  275. unsigned char flags;
  276. bitmap_zero(map.bits, PNP_IRQ_NR);
  277. for (i = 0; i < p->interrupt_count; i++)
  278. if (p->interrupts[i])
  279. __set_bit(p->interrupts[i], map.bits);
  280. flags = acpi_dev_irq_flags(p->triggering, p->polarity, p->shareable, p->wake_capable);
  281. pnp_register_irq_resource(dev, option_flags, &map, flags);
  282. }
  283. static __init void pnpacpi_parse_ext_irq_option(struct pnp_dev *dev,
  284. unsigned int option_flags,
  285. struct acpi_resource_extended_irq *p)
  286. {
  287. int i;
  288. pnp_irq_mask_t map;
  289. unsigned char flags;
  290. bitmap_zero(map.bits, PNP_IRQ_NR);
  291. for (i = 0; i < p->interrupt_count; i++) {
  292. if (p->interrupts[i]) {
  293. if (p->interrupts[i] < PNP_IRQ_NR)
  294. __set_bit(p->interrupts[i], map.bits);
  295. else
  296. dev_err(&dev->dev,
  297. "ignoring IRQ %d option (too large for %d entry bitmap)\n",
  298. p->interrupts[i], PNP_IRQ_NR);
  299. }
  300. }
  301. flags = acpi_dev_irq_flags(p->triggering, p->polarity, p->shareable, p->wake_capable);
  302. pnp_register_irq_resource(dev, option_flags, &map, flags);
  303. }
  304. static __init void pnpacpi_parse_port_option(struct pnp_dev *dev,
  305. unsigned int option_flags,
  306. struct acpi_resource_io *io)
  307. {
  308. unsigned char flags = 0;
  309. if (io->io_decode == ACPI_DECODE_16)
  310. flags = IORESOURCE_IO_16BIT_ADDR;
  311. pnp_register_port_resource(dev, option_flags, io->minimum, io->maximum,
  312. io->alignment, io->address_length, flags);
  313. }
  314. static __init void pnpacpi_parse_fixed_port_option(struct pnp_dev *dev,
  315. unsigned int option_flags,
  316. struct acpi_resource_fixed_io *io)
  317. {
  318. pnp_register_port_resource(dev, option_flags, io->address, io->address,
  319. 0, io->address_length, IORESOURCE_IO_FIXED);
  320. }
  321. static __init void pnpacpi_parse_mem24_option(struct pnp_dev *dev,
  322. unsigned int option_flags,
  323. struct acpi_resource_memory24 *p)
  324. {
  325. unsigned char flags = 0;
  326. if (p->write_protect == ACPI_READ_WRITE_MEMORY)
  327. flags = IORESOURCE_MEM_WRITEABLE;
  328. pnp_register_mem_resource(dev, option_flags, p->minimum, p->maximum,
  329. p->alignment, p->address_length, flags);
  330. }
  331. static __init void pnpacpi_parse_mem32_option(struct pnp_dev *dev,
  332. unsigned int option_flags,
  333. struct acpi_resource_memory32 *p)
  334. {
  335. unsigned char flags = 0;
  336. if (p->write_protect == ACPI_READ_WRITE_MEMORY)
  337. flags = IORESOURCE_MEM_WRITEABLE;
  338. pnp_register_mem_resource(dev, option_flags, p->minimum, p->maximum,
  339. p->alignment, p->address_length, flags);
  340. }
  341. static __init void pnpacpi_parse_fixed_mem32_option(struct pnp_dev *dev,
  342. unsigned int option_flags,
  343. struct acpi_resource_fixed_memory32 *p)
  344. {
  345. unsigned char flags = 0;
  346. if (p->write_protect == ACPI_READ_WRITE_MEMORY)
  347. flags = IORESOURCE_MEM_WRITEABLE;
  348. pnp_register_mem_resource(dev, option_flags, p->address, p->address,
  349. 0, p->address_length, flags);
  350. }
  351. static __init void pnpacpi_parse_address_option(struct pnp_dev *dev,
  352. unsigned int option_flags,
  353. struct acpi_resource *r)
  354. {
  355. struct acpi_resource_address64 addr, *p = &addr;
  356. acpi_status status;
  357. unsigned char flags = 0;
  358. status = acpi_resource_to_address64(r, p);
  359. if (ACPI_FAILURE(status)) {
  360. dev_warn(&dev->dev, "can't convert resource type %d\n",
  361. r->type);
  362. return;
  363. }
  364. if (p->resource_type == ACPI_MEMORY_RANGE) {
  365. if (p->info.mem.write_protect == ACPI_READ_WRITE_MEMORY)
  366. flags = IORESOURCE_MEM_WRITEABLE;
  367. pnp_register_mem_resource(dev, option_flags, p->address.minimum,
  368. p->address.minimum, 0, p->address.address_length,
  369. flags);
  370. } else if (p->resource_type == ACPI_IO_RANGE)
  371. pnp_register_port_resource(dev, option_flags, p->address.minimum,
  372. p->address.minimum, 0, p->address.address_length,
  373. IORESOURCE_IO_FIXED);
  374. }
  375. static __init void pnpacpi_parse_ext_address_option(struct pnp_dev *dev,
  376. unsigned int option_flags,
  377. struct acpi_resource *r)
  378. {
  379. struct acpi_resource_extended_address64 *p = &r->data.ext_address64;
  380. unsigned char flags = 0;
  381. if (p->resource_type == ACPI_MEMORY_RANGE) {
  382. if (p->info.mem.write_protect == ACPI_READ_WRITE_MEMORY)
  383. flags = IORESOURCE_MEM_WRITEABLE;
  384. pnp_register_mem_resource(dev, option_flags, p->address.minimum,
  385. p->address.minimum, 0, p->address.address_length,
  386. flags);
  387. } else if (p->resource_type == ACPI_IO_RANGE)
  388. pnp_register_port_resource(dev, option_flags, p->address.minimum,
  389. p->address.minimum, 0, p->address.address_length,
  390. IORESOURCE_IO_FIXED);
  391. }
  392. struct acpipnp_parse_option_s {
  393. struct pnp_dev *dev;
  394. unsigned int option_flags;
  395. };
  396. static __init acpi_status pnpacpi_option_resource(struct acpi_resource *res,
  397. void *data)
  398. {
  399. int priority;
  400. struct acpipnp_parse_option_s *parse_data = data;
  401. struct pnp_dev *dev = parse_data->dev;
  402. unsigned int option_flags = parse_data->option_flags;
  403. switch (res->type) {
  404. case ACPI_RESOURCE_TYPE_IRQ:
  405. pnpacpi_parse_irq_option(dev, option_flags, &res->data.irq);
  406. break;
  407. case ACPI_RESOURCE_TYPE_DMA:
  408. pnpacpi_parse_dma_option(dev, option_flags, &res->data.dma);
  409. break;
  410. case ACPI_RESOURCE_TYPE_START_DEPENDENT:
  411. switch (res->data.start_dpf.compatibility_priority) {
  412. case ACPI_GOOD_CONFIGURATION:
  413. priority = PNP_RES_PRIORITY_PREFERRED;
  414. break;
  415. case ACPI_ACCEPTABLE_CONFIGURATION:
  416. priority = PNP_RES_PRIORITY_ACCEPTABLE;
  417. break;
  418. case ACPI_SUB_OPTIMAL_CONFIGURATION:
  419. priority = PNP_RES_PRIORITY_FUNCTIONAL;
  420. break;
  421. default:
  422. priority = PNP_RES_PRIORITY_INVALID;
  423. break;
  424. }
  425. parse_data->option_flags = pnp_new_dependent_set(dev, priority);
  426. break;
  427. case ACPI_RESOURCE_TYPE_END_DEPENDENT:
  428. parse_data->option_flags = 0;
  429. break;
  430. case ACPI_RESOURCE_TYPE_IO:
  431. pnpacpi_parse_port_option(dev, option_flags, &res->data.io);
  432. break;
  433. case ACPI_RESOURCE_TYPE_FIXED_IO:
  434. pnpacpi_parse_fixed_port_option(dev, option_flags,
  435. &res->data.fixed_io);
  436. break;
  437. case ACPI_RESOURCE_TYPE_VENDOR:
  438. case ACPI_RESOURCE_TYPE_END_TAG:
  439. break;
  440. case ACPI_RESOURCE_TYPE_MEMORY24:
  441. pnpacpi_parse_mem24_option(dev, option_flags,
  442. &res->data.memory24);
  443. break;
  444. case ACPI_RESOURCE_TYPE_MEMORY32:
  445. pnpacpi_parse_mem32_option(dev, option_flags,
  446. &res->data.memory32);
  447. break;
  448. case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
  449. pnpacpi_parse_fixed_mem32_option(dev, option_flags,
  450. &res->data.fixed_memory32);
  451. break;
  452. case ACPI_RESOURCE_TYPE_ADDRESS16:
  453. case ACPI_RESOURCE_TYPE_ADDRESS32:
  454. case ACPI_RESOURCE_TYPE_ADDRESS64:
  455. pnpacpi_parse_address_option(dev, option_flags, res);
  456. break;
  457. case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
  458. pnpacpi_parse_ext_address_option(dev, option_flags, res);
  459. break;
  460. case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
  461. pnpacpi_parse_ext_irq_option(dev, option_flags,
  462. &res->data.extended_irq);
  463. break;
  464. case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
  465. break;
  466. default:
  467. dev_warn(&dev->dev, "unknown resource type %d in _PRS\n",
  468. res->type);
  469. return AE_ERROR;
  470. }
  471. return AE_OK;
  472. }
  473. int __init pnpacpi_parse_resource_option_data(struct pnp_dev *dev)
  474. {
  475. struct acpi_device *acpi_dev = dev->data;
  476. acpi_handle handle = acpi_dev->handle;
  477. acpi_status status;
  478. struct acpipnp_parse_option_s parse_data;
  479. pnp_dbg(&dev->dev, "parse resource options\n");
  480. parse_data.dev = dev;
  481. parse_data.option_flags = 0;
  482. status = acpi_walk_resources(handle, METHOD_NAME__PRS,
  483. pnpacpi_option_resource, &parse_data);
  484. if (ACPI_FAILURE(status)) {
  485. if (status != AE_NOT_FOUND)
  486. dev_err(&dev->dev, "can't evaluate _PRS: %d", status);
  487. return -EPERM;
  488. }
  489. return 0;
  490. }
  491. static int pnpacpi_supported_resource(struct acpi_resource *res)
  492. {
  493. switch (res->type) {
  494. case ACPI_RESOURCE_TYPE_IRQ:
  495. case ACPI_RESOURCE_TYPE_DMA:
  496. case ACPI_RESOURCE_TYPE_IO:
  497. case ACPI_RESOURCE_TYPE_FIXED_IO:
  498. case ACPI_RESOURCE_TYPE_MEMORY24:
  499. case ACPI_RESOURCE_TYPE_MEMORY32:
  500. case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
  501. case ACPI_RESOURCE_TYPE_ADDRESS16:
  502. case ACPI_RESOURCE_TYPE_ADDRESS32:
  503. case ACPI_RESOURCE_TYPE_ADDRESS64:
  504. case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
  505. case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
  506. return 1;
  507. }
  508. return 0;
  509. }
  510. /*
  511. * Set resource
  512. */
  513. static acpi_status pnpacpi_count_resources(struct acpi_resource *res,
  514. void *data)
  515. {
  516. int *res_cnt = data;
  517. if (pnpacpi_supported_resource(res))
  518. (*res_cnt)++;
  519. return AE_OK;
  520. }
  521. static acpi_status pnpacpi_type_resources(struct acpi_resource *res, void *data)
  522. {
  523. struct acpi_resource **resource = data;
  524. if (pnpacpi_supported_resource(res)) {
  525. (*resource)->type = res->type;
  526. (*resource)->length = sizeof(struct acpi_resource);
  527. if (res->type == ACPI_RESOURCE_TYPE_IRQ)
  528. (*resource)->data.irq.descriptor_length =
  529. res->data.irq.descriptor_length;
  530. (*resource)++;
  531. }
  532. return AE_OK;
  533. }
  534. int pnpacpi_build_resource_template(struct pnp_dev *dev,
  535. struct acpi_buffer *buffer)
  536. {
  537. struct acpi_device *acpi_dev = dev->data;
  538. acpi_handle handle = acpi_dev->handle;
  539. struct acpi_resource *resource;
  540. int res_cnt = 0;
  541. acpi_status status;
  542. status = acpi_walk_resources(handle, METHOD_NAME__CRS,
  543. pnpacpi_count_resources, &res_cnt);
  544. if (ACPI_FAILURE(status)) {
  545. dev_err(&dev->dev, "can't evaluate _CRS: %d\n", status);
  546. return -EINVAL;
  547. }
  548. if (!res_cnt)
  549. return -EINVAL;
  550. buffer->length = sizeof(struct acpi_resource) * (res_cnt + 1) + 1;
  551. buffer->pointer = kzalloc(buffer->length - 1, GFP_KERNEL);
  552. if (!buffer->pointer)
  553. return -ENOMEM;
  554. resource = (struct acpi_resource *)buffer->pointer;
  555. status = acpi_walk_resources(handle, METHOD_NAME__CRS,
  556. pnpacpi_type_resources, &resource);
  557. if (ACPI_FAILURE(status)) {
  558. kfree(buffer->pointer);
  559. dev_err(&dev->dev, "can't evaluate _CRS: %d\n", status);
  560. return -EINVAL;
  561. }
  562. /* resource will pointer the end resource now */
  563. resource->type = ACPI_RESOURCE_TYPE_END_TAG;
  564. resource->length = sizeof(struct acpi_resource);
  565. return 0;
  566. }
  567. static void pnpacpi_encode_irq(struct pnp_dev *dev,
  568. struct acpi_resource *resource,
  569. struct resource *p)
  570. {
  571. struct acpi_resource_irq *irq = &resource->data.irq;
  572. u8 triggering, polarity, shareable;
  573. if (!pnp_resource_enabled(p)) {
  574. irq->interrupt_count = 0;
  575. pnp_dbg(&dev->dev, " encode irq (%s)\n",
  576. p ? "disabled" : "missing");
  577. return;
  578. }
  579. decode_irq_flags(dev, p->flags, &triggering, &polarity, &shareable);
  580. irq->triggering = triggering;
  581. irq->polarity = polarity;
  582. irq->shareable = shareable;
  583. irq->interrupt_count = 1;
  584. irq->interrupts[0] = p->start;
  585. pnp_dbg(&dev->dev, " encode irq %d %s %s %s (%d-byte descriptor)\n",
  586. (int) p->start,
  587. triggering == ACPI_LEVEL_SENSITIVE ? "level" : "edge",
  588. polarity == ACPI_ACTIVE_LOW ? "low" : "high",
  589. irq->shareable == ACPI_SHARED ? "shared" : "exclusive",
  590. irq->descriptor_length);
  591. }
  592. static void pnpacpi_encode_ext_irq(struct pnp_dev *dev,
  593. struct acpi_resource *resource,
  594. struct resource *p)
  595. {
  596. struct acpi_resource_extended_irq *extended_irq = &resource->data.extended_irq;
  597. u8 triggering, polarity, shareable;
  598. if (!pnp_resource_enabled(p)) {
  599. extended_irq->interrupt_count = 0;
  600. pnp_dbg(&dev->dev, " encode extended irq (%s)\n",
  601. p ? "disabled" : "missing");
  602. return;
  603. }
  604. decode_irq_flags(dev, p->flags, &triggering, &polarity, &shareable);
  605. extended_irq->producer_consumer = ACPI_CONSUMER;
  606. extended_irq->triggering = triggering;
  607. extended_irq->polarity = polarity;
  608. extended_irq->shareable = shareable;
  609. extended_irq->interrupt_count = 1;
  610. extended_irq->interrupts[0] = p->start;
  611. pnp_dbg(&dev->dev, " encode irq %d %s %s %s\n", (int) p->start,
  612. triggering == ACPI_LEVEL_SENSITIVE ? "level" : "edge",
  613. polarity == ACPI_ACTIVE_LOW ? "low" : "high",
  614. extended_irq->shareable == ACPI_SHARED ? "shared" : "exclusive");
  615. }
  616. static void pnpacpi_encode_dma(struct pnp_dev *dev,
  617. struct acpi_resource *resource,
  618. struct resource *p)
  619. {
  620. struct acpi_resource_dma *dma = &resource->data.dma;
  621. if (!pnp_resource_enabled(p)) {
  622. dma->channel_count = 0;
  623. pnp_dbg(&dev->dev, " encode dma (%s)\n",
  624. p ? "disabled" : "missing");
  625. return;
  626. }
  627. /* Note: pnp_assign_dma will copy pnp_dma->flags into p->flags */
  628. switch (p->flags & IORESOURCE_DMA_SPEED_MASK) {
  629. case IORESOURCE_DMA_TYPEA:
  630. dma->type = ACPI_TYPE_A;
  631. break;
  632. case IORESOURCE_DMA_TYPEB:
  633. dma->type = ACPI_TYPE_B;
  634. break;
  635. case IORESOURCE_DMA_TYPEF:
  636. dma->type = ACPI_TYPE_F;
  637. break;
  638. default:
  639. dma->type = ACPI_COMPATIBILITY;
  640. }
  641. switch (p->flags & IORESOURCE_DMA_TYPE_MASK) {
  642. case IORESOURCE_DMA_8BIT:
  643. dma->transfer = ACPI_TRANSFER_8;
  644. break;
  645. case IORESOURCE_DMA_8AND16BIT:
  646. dma->transfer = ACPI_TRANSFER_8_16;
  647. break;
  648. default:
  649. dma->transfer = ACPI_TRANSFER_16;
  650. }
  651. dma->bus_master = !!(p->flags & IORESOURCE_DMA_MASTER);
  652. dma->channel_count = 1;
  653. dma->channels[0] = p->start;
  654. pnp_dbg(&dev->dev, " encode dma %d "
  655. "type %#x transfer %#x master %d\n",
  656. (int) p->start, dma->type, dma->transfer, dma->bus_master);
  657. }
  658. static void pnpacpi_encode_io(struct pnp_dev *dev,
  659. struct acpi_resource *resource,
  660. struct resource *p)
  661. {
  662. struct acpi_resource_io *io = &resource->data.io;
  663. if (pnp_resource_enabled(p)) {
  664. /* Note: pnp_assign_port copies pnp_port->flags into p->flags */
  665. io->io_decode = (p->flags & IORESOURCE_IO_16BIT_ADDR) ?
  666. ACPI_DECODE_16 : ACPI_DECODE_10;
  667. io->minimum = p->start;
  668. io->maximum = p->end;
  669. io->alignment = 0; /* Correct? */
  670. io->address_length = resource_size(p);
  671. } else {
  672. io->minimum = 0;
  673. io->address_length = 0;
  674. }
  675. pnp_dbg(&dev->dev, " encode io %#x-%#x decode %#x\n", io->minimum,
  676. io->minimum + io->address_length - 1, io->io_decode);
  677. }
  678. static void pnpacpi_encode_fixed_io(struct pnp_dev *dev,
  679. struct acpi_resource *resource,
  680. struct resource *p)
  681. {
  682. struct acpi_resource_fixed_io *fixed_io = &resource->data.fixed_io;
  683. if (pnp_resource_enabled(p)) {
  684. fixed_io->address = p->start;
  685. fixed_io->address_length = resource_size(p);
  686. } else {
  687. fixed_io->address = 0;
  688. fixed_io->address_length = 0;
  689. }
  690. pnp_dbg(&dev->dev, " encode fixed_io %#x-%#x\n", fixed_io->address,
  691. fixed_io->address + fixed_io->address_length - 1);
  692. }
  693. static void pnpacpi_encode_mem24(struct pnp_dev *dev,
  694. struct acpi_resource *resource,
  695. struct resource *p)
  696. {
  697. struct acpi_resource_memory24 *memory24 = &resource->data.memory24;
  698. if (pnp_resource_enabled(p)) {
  699. /* Note: pnp_assign_mem copies pnp_mem->flags into p->flags */
  700. memory24->write_protect = p->flags & IORESOURCE_MEM_WRITEABLE ?
  701. ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;
  702. memory24->minimum = p->start;
  703. memory24->maximum = p->end;
  704. memory24->alignment = 0;
  705. memory24->address_length = resource_size(p);
  706. } else {
  707. memory24->minimum = 0;
  708. memory24->address_length = 0;
  709. }
  710. pnp_dbg(&dev->dev, " encode mem24 %#x-%#x write_protect %#x\n",
  711. memory24->minimum,
  712. memory24->minimum + memory24->address_length - 1,
  713. memory24->write_protect);
  714. }
  715. static void pnpacpi_encode_mem32(struct pnp_dev *dev,
  716. struct acpi_resource *resource,
  717. struct resource *p)
  718. {
  719. struct acpi_resource_memory32 *memory32 = &resource->data.memory32;
  720. if (pnp_resource_enabled(p)) {
  721. memory32->write_protect = p->flags & IORESOURCE_MEM_WRITEABLE ?
  722. ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;
  723. memory32->minimum = p->start;
  724. memory32->maximum = p->end;
  725. memory32->alignment = 0;
  726. memory32->address_length = resource_size(p);
  727. } else {
  728. memory32->minimum = 0;
  729. memory32->alignment = 0;
  730. }
  731. pnp_dbg(&dev->dev, " encode mem32 %#x-%#x write_protect %#x\n",
  732. memory32->minimum,
  733. memory32->minimum + memory32->address_length - 1,
  734. memory32->write_protect);
  735. }
  736. static void pnpacpi_encode_fixed_mem32(struct pnp_dev *dev,
  737. struct acpi_resource *resource,
  738. struct resource *p)
  739. {
  740. struct acpi_resource_fixed_memory32 *fixed_memory32 = &resource->data.fixed_memory32;
  741. if (pnp_resource_enabled(p)) {
  742. fixed_memory32->write_protect =
  743. p->flags & IORESOURCE_MEM_WRITEABLE ?
  744. ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;
  745. fixed_memory32->address = p->start;
  746. fixed_memory32->address_length = resource_size(p);
  747. } else {
  748. fixed_memory32->address = 0;
  749. fixed_memory32->address_length = 0;
  750. }
  751. pnp_dbg(&dev->dev, " encode fixed_mem32 %#x-%#x write_protect %#x\n",
  752. fixed_memory32->address,
  753. fixed_memory32->address + fixed_memory32->address_length - 1,
  754. fixed_memory32->write_protect);
  755. }
  756. int pnpacpi_encode_resources(struct pnp_dev *dev, struct acpi_buffer *buffer)
  757. {
  758. int i = 0;
  759. /* pnpacpi_build_resource_template allocates extra mem */
  760. int res_cnt = (buffer->length - 1) / sizeof(struct acpi_resource) - 1;
  761. struct acpi_resource *resource = buffer->pointer;
  762. unsigned int port = 0, irq = 0, dma = 0, mem = 0;
  763. pnp_dbg(&dev->dev, "encode %d resources\n", res_cnt);
  764. while (i < res_cnt) {
  765. switch (resource->type) {
  766. case ACPI_RESOURCE_TYPE_IRQ:
  767. pnpacpi_encode_irq(dev, resource,
  768. pnp_get_resource(dev, IORESOURCE_IRQ, irq));
  769. irq++;
  770. break;
  771. case ACPI_RESOURCE_TYPE_DMA:
  772. pnpacpi_encode_dma(dev, resource,
  773. pnp_get_resource(dev, IORESOURCE_DMA, dma));
  774. dma++;
  775. break;
  776. case ACPI_RESOURCE_TYPE_IO:
  777. pnpacpi_encode_io(dev, resource,
  778. pnp_get_resource(dev, IORESOURCE_IO, port));
  779. port++;
  780. break;
  781. case ACPI_RESOURCE_TYPE_FIXED_IO:
  782. pnpacpi_encode_fixed_io(dev, resource,
  783. pnp_get_resource(dev, IORESOURCE_IO, port));
  784. port++;
  785. break;
  786. case ACPI_RESOURCE_TYPE_MEMORY24:
  787. pnpacpi_encode_mem24(dev, resource,
  788. pnp_get_resource(dev, IORESOURCE_MEM, mem));
  789. mem++;
  790. break;
  791. case ACPI_RESOURCE_TYPE_MEMORY32:
  792. pnpacpi_encode_mem32(dev, resource,
  793. pnp_get_resource(dev, IORESOURCE_MEM, mem));
  794. mem++;
  795. break;
  796. case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
  797. pnpacpi_encode_fixed_mem32(dev, resource,
  798. pnp_get_resource(dev, IORESOURCE_MEM, mem));
  799. mem++;
  800. break;
  801. case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
  802. pnpacpi_encode_ext_irq(dev, resource,
  803. pnp_get_resource(dev, IORESOURCE_IRQ, irq));
  804. irq++;
  805. break;
  806. case ACPI_RESOURCE_TYPE_START_DEPENDENT:
  807. case ACPI_RESOURCE_TYPE_END_DEPENDENT:
  808. case ACPI_RESOURCE_TYPE_VENDOR:
  809. case ACPI_RESOURCE_TYPE_END_TAG:
  810. case ACPI_RESOURCE_TYPE_ADDRESS16:
  811. case ACPI_RESOURCE_TYPE_ADDRESS32:
  812. case ACPI_RESOURCE_TYPE_ADDRESS64:
  813. case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
  814. case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
  815. default: /* other type */
  816. dev_warn(&dev->dev,
  817. "can't encode unknown resource type %d\n",
  818. resource->type);
  819. return -EINVAL;
  820. }
  821. resource++;
  822. i++;
  823. }
  824. return 0;
  825. }