text:
I want to volunteer I make a donation
Mission and approaches
Our action
Press reviews on children's rights
What is international volunteering?
Volunteer's Blog
PRIDE project
PRIDE Social Lab
I make a donation
Honduras: Civil society engages in the fight against human trafficking
Last January, members of the IBCR Montreal team travelled to Honduras for a week, to meet with their colleagues in the satellite office's team. This mission took place within the framework of the project against human trafficking and exploitation, especially women and girls, funded by Global Affairs Canada and implemented by the IBCR since spring 2019, in partnership with the Inter-institutional Commission against Commercial Sexual Exploitation and Trafficking in Persons (CICESCT).
During this mission, training courses were provided to the experts of the field team and the IBCR project management methodology was presented. The members of the Montreal's team were also able to meet the new project manager in Honduras, who took up his duties in January, and both teams could share their knowledge and experience in order to strengthen the action plan and develop effective training. Various development workshops were also held, including with the Secretaria del Trabajo (Minister of Labour) and indigenous populations.
In addition, the team was able to meet with Tulio Mariano González, Director General of DINAFROH, Directorate of Indigenous and Afro-Honduran Peoples, as well as a representative of the indigenous people, to discuss the next steps of the project with these populations.
It was thus decided that, in partnership with the CICESCT, a training session on the phenomenon of human trafficking specifically targeting indigenous and Afro-Honduran populations would be held. As a result, people will learn more about the technical aspects (indicators) of trafficking in order to develop and improve prevention plans.
The week also provided an opportunity to focus on the issue of gender and intersectionality* in the fight against the phenomenon of trafficking and its integration into the project. Exercises on this topic were organised to better orient experts and understand the context in which women and girls live in Honduran society. Ultimately, a normative framework based on an intersectional approach will be established.
Zoom: What is intersectionality?
Created by Kimberlé Crenshaw in 1991, the term refers to the situation of people simultaneously experiencing several forms of domination or discrimination in a society. Intersectionality allows for the integration of the differences between women, allowing us to go beyond the very notion of [dominant] feminism. This prism also offers a new space of visibility to women who experience both sexism and racism and, by extension, sexism and classism, sexism and homophobia, sexism and transphobia, but also transphobia, homophobia, classism and racism within feminism. (Definition Les Glorieuses)
Photo caption: The Bureau's Montréal team members with their colleagues of the satellite office in Honduras.
See all blogs Events
805 Villeray St.
Montreal, Quebec H2R 1J4
I make a donation I want to volunteer
© 2023 All rights reserved. IBCR. Design by Atypic.


Construction Agricultural Film 16 Feet X100 Feet Rolls 6 Mil Discounts Apply !
Construction Film on a roll. Suitable for for non-food use in construction or agriculture. 16 feet wide x 100 feet long rolls.
6 Mil (0.006 inches) thick.
The clear and black color film is wound on a 1.50 inch core.
The light white tint is wound on a 3 Inch core.
© Copyright 2011 - KPR Adcor Inc.


text:
Everest Group names Capgemini a leader in Next-generation Quality Assurance (QA) Services PEAK Matrix Assessment 2020
Capgemini today announced it has been positioned as a Leader in the Next-generation Quality Assurance (QA) Services PEAK MatrixTM 2020 assessment.
Everest Group analyzed 19 service providers as a part of this report under the evaluation parameters of market impact, vision and capability. Capgemini was recognized for its "investment in a suite of cognitive QA and test automation solutions that can deliver meaningful cost and effort saving."
The report also acknowledged Capgemini for:
Building proprietary tools for Connected Ecosystem testing, both at IT and OT layers, along with relevant proof points
Demonstrating proof points along with business impact across different areas in Next-gen QA, particularly in areas related to cloud-native and connected products testing
Mark Buenen, Global Leader, Digital Assurance and Quality Engineering for the Capgemini Group said: "We are delighted to be positioned as a Leader in next-generation Quality Assurance services by Everest Group. Capgemini is committed to enabling business transformation and agility for its customers in the disruptive, digital-led environment. Our best-in-class QA services are designed to cater to addressing organizational challenges around quality, security and responsiveness to business demands, while optimizing budgets, time and resources."
"Enhanced customer experience and faster speed-to-market will continue being our focus areas as we collaborate with our customers to build enterprises of the future," he further added.
"To serve the evolving QA market, both in terms of role and technology landscape, Capgemini has invested in a suite of cognitive QA and test automation solutions focused on delivering cost and effort savings," according to Yugal Joshi, Vice President, Everest Group. "Capgemini also leverages relevant proof points, especially in cloud-native applications and connected ecosystems areas, to boost enterprise confidence."
Capgemini is at the forefront of providing world class solutions for next generation Quality Assurance to its customers globally, incorporating digital technologies such as collaborative robotics, data analytics, machine learning, immersive technologies and intelligent automation assistants.
To read the full report, please click here:

redpajama_set_name: RedPajamaCommonCrawl


text:
Democrats Turn to Petty Politics To Keep Relief Funding Away from Heartland States
By Ben Marquis
Published April 2, 2019 at 1:39pm
Of the many things that Democrats have criticized President Donald Trump over, the narrative that Trump's administration offered up incomplete disaster relief to the island territory of Puerto Rico following back-to-back hurricanes in 2017 ranks near the top of the most disingenuous.
Resources and rescue operations from the federal government had been pre-staged and rushed into Puerto Rico almost immediately after the storms had passed, and the island has received tens of billions of dollars in federal aid to assist with recovery efforts over the several months since that time.
Yet, Puerto Rico remains a complete mess and has made minimal progress in recovery efforts over that same time frame, and Democrats seem intent on not only blaming the disastrous aftermath on Trump but also using the island's poor recovery as a political cudgel against the president.
Senate Democrats, with the help of a few Republicans, managed to kill a bill that would have provided billions in disaster relief funding for Midwest states inundated with severe flooding due to recent strong storm systems and snow-melt from the spring thaw that has raised river and creek levels to dangerous heights, Fox News reported.
The purported reason for the death of that bill, which failed by a vote of 44-49, was the fact that Democrats had demanded an extra $700 million in disaster relief for Puerto Rico, on top of an unspecified amount of disaster aid for the island already included in the measure.
That money was theoretically supposed to go toward rebuilding the island's damaged water systems. Democrats had also demanded that the Trump administration unlock previously appropriated funds destined for the island's recovery efforts — though it is unclear how much, if any, of that relief has been held up by the administration.
Republican Florida Sen. Marco Rubio said in a tweet that Democrats had turned disaster funding into a "partisan issue," while Republican Iowa Sen. Chuck Grassley decried Democratic hypocrisy in lamenting "Washington political games" out on the campaign trail while engaging in such games while in Washington itself.
My statement on Senate Democrats continuing to play politics with much-needed disaster funding https://t.co/ArY6UIJY8x pic.twitter.com/2U13F3tl6Y
— Senator Rubio Press (@SenRubioPress) April 2, 2019
Do you think Democrats will use anything to attack Trump?
Following the vote, Republican Georgia Sen. David Perdue, who sponsored the bill, tweeted, "I have never been more frustrated as a United States Senator than I am right now. This is pure partisan politics."
"Washington has reached a new low — it's been nearly six months since Hurricane Michael ravaged Georgia and other states across the country, and Congress has failed to help the very people it claims to represent," Perdue later said in a statement.
Senate Majority Leader Mitch McConnell warned, "This is no time for my colleagues across the aisle to prioritize a political fight with the president ahead of the urgent needs of communities across America."
Yet, that is exactly what the Democrats did, an act that compelled a flurry of outraged tweets from President Trump on Monday night that spilled over into Tuesday morning.
Trump wrote, "The Democrats today killed a Bill that would have provided great relief to Farmers and yet more money to Puerto Rico despite the fact that Puerto Rico has already been scheduled to receive more hurricane relief funding than any 'place' in history."
RELATED: Language Police: House Dems Push Deceitful Bill to Ban Government From Saying 'Illegal Alien'
The Democrats today killed a Bill that would have provided great relief to Farmers and yet more money to Puerto Rico despite the fact that Puerto Rico has already been scheduled to receive more hurricane relief funding than any "place" in history. The people of Puerto Rico…..
— Donald J. Trump (@realDonaldTrump) April 2, 2019
"The people of Puerto Rico … are GREAT, but the politicians are incompetent or corrupt. Puerto Rico got far more money than Texas & Florida combined, yet their government can't do anything right, the place is a mess – nothing works," he continued.
"FEMA & the Military worked emergency miracles, but politicians like … the crazed and incompetent Mayor of San Juan have done such a poor job of bringing the Island back to health. 91 Billion Dollars to Puerto Rico, and now the Dems want to give them more, taking dollars away from our Farmers and so many others. Disgraceful!" Trump added.
Puerto Rico had already received more than $91 billion in relief funding, Fox News reported. Meanwhile, Florida and Texas — who also were hard-hit by the same hurricanes that demolished Puerto Rico — have received only $12 billion and $29 billion in disaster relief, respectively.
Tuesday morning, Trump tweeted, "Puerto Rico got 91 Billion Dollars for the hurricane, more money than has ever been gotten for a hurricane before, & all their local politicians do is complain & ask for more money. The pols are grossly incompetent, spend the money foolishly or corruptly, & only take from USA."
In a follow-up tweet, the president noted of the island territory, "So many wonderful people, but with such bad Island leadership and with so much money wasted. Cannot continue to hurt our Farmers and States with these massive payments, and so little appreciation!"
The Democrat-dominated leadership of Puerto Rico is corrupt and incompetent, and they — along with their Democratic allies in the United States — have ignored their own shortcomings and cast blame for their own ignorant failures on Trump.
Unfortunately for them, he is not like other Republicans who will quietly shoulder the blame and move on. Instead, he is punching back and making sure everyone knows that Puerto Rico's leadership is at fault for the utterly dismal disaster that island was, is, and will continue to be … so long as Democrats remain in charge of it.
Ben Marquis
Ben Marquis is a writer who identifies as a constitutional conservative/libertarian. He has covered current events and politics for Conservative Tribune since 2014. His focus is on protecting the First and Second Amendments.
Ben Marquis has covered current events and politics for Conservative Tribune since 2014. He reads voraciously and writes about the news of the day from a conservative-libertarian perspective. He is an advocate for a more constitutional government and a staunch defender of the Second Amendment, which protects the rest of our natural rights. He lives in Little Rock, Arkansas, with the love of his life as well as four dogs and four cats.
WHO Declares Global Emergency After Ebola Hits 'Gateway' to the World
Just In: 19 MS-13 Gang Members Charged with 'Medieval-Style' Slayings Here Illegally
Cost of Sanctuary: County Spends $250,000 on Top Defense Lawyers for Illegals
Sanders Finally Reveals Disgustingly Enormous Price Tag of Healthcare Plan
Video: Ilhan Omar Laughs After Being Asked To Condemn Antifa Terrorist Attack
Tags: Democrats, Donald Trump, natural disasters, Puerto Rico, Republicans, Senate, Trump administration


text:
Harding University Students Visit Clinipace's High Wycombe Office in the UK
By Martin Cripps / July 11, 2013
Home / Blog / Harding University Students Visit Clinipace's High Wycombe Office in the UK
Clinipace recently hosted a group of Harding University students and their professor as part of the University's summer program.
Harding University, which is located in Searcy, Arkansas, has 7,155 students representing all 50 states and 53 foreign countries. Its summer program brings students to the UK where they visit various businesses across multiple sectors, including: Bank of England, Tate and Lyle, Oxford University, and BMW/Mini.
On July 5, Accounting Professor, James G. Shelton, PhD, with the University's Paul R. Carter College of Business Administration and 18 of his students visited Clinipace's High Wycombe office for a presentation followed by lunch.
Our presentation, which was titled "Introduction to Healthcare R&D and Contract Research Organizations" gave an industry overview, outlined phases of clinical development and examined the ecosystem that supports pharma/biotech product development. The students were very interested in technology-enabled business solutions like Clinipace's digital CRO business model and our TEMPO eClinical platform.
It was a great day for everyone involved! I would like to extend a special thank you to Cecil Wood (Clinipace's Director of Business Development) and Vicky Chialton (Clinipace's Site Management Services Team Leader) for sharing their time with the students during the visit.


text:
Manco bzw. Manço ist der Familienname folgender Personen:

 Barış Manço (1943–1999), türkischer Sänger, Komponist und Fernsehproduzent
 Reimond Manco (* 1990), peruanischer Fußballspieler
 Tomas Manco (* 1988), australischer Eishockeyspieler

Siehe auch:
 Manco Cápac (Begriffsklärung)
 Manko (Begriffsklärung)
 Mancini

redpajama_set_name: RedPajamaWikipedia


9 out of 10 based on 480 ratings. 4,687 user reviews.
Downloadable 65 Mustang Manuals Details. The 1965 Mustang Shop Manuals listed here are digital versions of the original Mustang repair manual used by the dealership mechanics to guide them through repairs and maintenance.
www›Search›1965 mustang repair manualFind great deals on eBay for 1965 mustang repair manual. Shop with confidence.
www››Car & Truck Service & Repair ManualsGet the best deal for Service & Repair Manuals for 1965 Ford Mustang from the largest online selection at eBay. Browse your favorite brands affordable prices free shipping on many items.
www›Search›1965 mustang owners manualFind great deals on eBay for 1965 mustang owners manual. Shop with confidence.
Body Assembly Manual for 1965 Mustangs. Looking for a little help with your restoration project? This illustrated body assembly manual shows how to attach all body components on your 1965 Mustang. Includes Ford part numbers in the illustrations for easy reference.


As a traveller in a foreign land, you must learn the language of these strange creatures to let them help you make your way through. Find all the alien words and talk to everyone you meet, and you could unlock the power of the monsters!
Log #1: Embedded WebGL build is experimental. For more stable builds, a standalone executable is recommended.
Log #2: Removed Embedded WebGL due to bugginess (Firefox on Windows always crashes). Will replace with Unity webplayer once a few things are sorted out.
Log #3: Replaced the embedded player with the Unity webplayer. All builds are updated to version 1.1: a new option, "Reset Save Data," has been added for Let's Players who likes to sample games before recording. This will reset unlocked vocabulary, as well as abilities and unlocked levels. Otherwise, NO GAMEPLAY OR GRAPHICS HAS BEEN CHANGED! So feel free to judge using this copy :-)!
* Fixing pause menu showing up while conversing with monsters.
* Fixing footstep sound effects volume to take option's stored setting into consideration.
Otherwise, NO GAMEPLAY OR GRAPHICS HAS BEEN CHANGED! So feel free to judge using this copy :-)!
Love the concept and playfulness of this. I imagine this would suit a controller pretty well!
The whole language learning systme is so juicy! (5/5 Innovation). And monsterish letters!
I think connection to theme is rather weak. The MONSTER part is in game but YOU ARE get lost somewhere.
PS Game feels japanese at first sight.
This is a really cool idea! It's really fun coming to understand the Monsters. Overall really solid entry.
I really enjoy this game. Having to lean all the language and talk to each monster really gave me a sense of immersion.
The monster language is super cute and funny, as were the designs of the monsters themselves. Platforming was sometimes mildly frustrating, but the floatiness of the jumping definitely made it more possible. More levels with more words would be fun!
Hey, you should improve and sell this game. I loved the simplicity and the moods.
While the theme doesn't seem to try and fit that greatly the game overall is a really fun and creative idea. I'd love to see this mechanic be used in a bigger project.
Very nice idea. Music and visuals are nice too. How great would it be to learn every language like this!?
Very very cute game! I liked the idea, but there's definitely a lot more you could do with it.
Very cute game! The concept is interesting and cute original, it can be expanded a lot more. The game was a bit too linear.
The most innovative game I've seen yet! Great job, lots of fun. Would love to see a post-compo version with more levels.
Hey, loved the game. I feel like anything I could say is regurgitation of previous praise but...: the game felt very polished, fun for any age, and had a unique atmosphere. Would have to hear it to say confidently that I'd love to see voice acting for language learned! Solid game!
Love the sprites. Had some strange issues with advancing text (though that appears to be on our end). It worked way better in the web player.
Thought the mechanic as it's a really different way of interacting and playing with the game.
Amazing game! Very cute, loved the aesthetic and how you animated the monsters. Gave it a handmade paper cut out feel. Really really cool mechanic. One of the most innovative games I've played so far.
Hey, this is excellent! I loved how complete it was, there seemed to be no serious rough edges or smth. Talking to monsters is fun, they themselves are cool dudes/dudettes, and that monster jump is just awesome, I liked it.
Pretty fun, I loved the language acquisition mechanic. The controls were a little floaty, and the footstep sounds were more business man in a suit than squishy monster. The music was great.
Very imaginative and unique idea for a game - I really liked it! The only thing I disliked was that the movement felt a little clunky at times but I got used to it rather quickly. Very nice, well done!
I like the concept and the drawings are charming. But, speaking to the monsters seemed too automatic. A more interactive language system might've been interesting.
Great game! I love how the game rules built up slowly as you learned new words. It would be cool to see more done with this concept.
I think the game was pretty good, but the gameplay would have been the same if you WEREN'T the monster so that's a bit lacking in the Theme.
Also, while the concept is really innovative, I think it'd be even more fun if the monsters' text was legible enough to try to play through some kind of hard mode that removed the translations so the player would have to take notes and figure out what words mean through context clues.
"Sar" which would be written down as meaning yes.
I liked the look and feel of this game a lot. The puzzles were a little slow for my taste, but fun and interesting. Great work!
@BtheDestroyer Yeah, adding hard mode where the sentences weren't translated for you was something we had in mind (as well as an in-game notepad). We didn't have the time to implement both.
Quite amazing. Excellent work. Innovative.
3d movement were smooth too!
Really nice concept, I just can't remember another game in LD with this mechanic. Nice music and really nice monster speech sound - feels really alien. I liked monster sprites and props but the islands and skybox are a bit out of place IMO. Controls are ok (maybe camera could move faster). Don't ask me why, but somehow the atmosphere in this game reminds me of Super Mario from N64.
It's actually really cool how the theme is touched here (dunno if it was the intention or just how I see it). They are "monsters" only while you don't understand them. When you do, you are a monster too. Thoughtful!
Woah, this is a real nice concept. A shame I can't rate graphics, the monsters are really cool looking, and so are the colors.
@LTyrosine In regards to the theme, yup, that was very intentional. The original pitch of the game was, "you're stuck in an alien world, and to escape from it, you have to blend in and even pass off as an alien." We've obviously simplified the idea further to just the language system, but "becoming a monster (or really, adopting with the natives)" was definitely in our minds making this.
@Ellian Graphics isn't part of the ratings because, well, they're not original. We found them on OpenGameArt.org, and per Jam rules, we've opted out. You can always check the credits to see their names and original artist.
Pretty fun puzzle platformer. I like the idea of becoming a monster by learning their language.
Really love the concept. Building a language to use as a mechanic was so cool. The graphics for the monsters are great. Nice work!


Home / Home & Garden / What Makes Modular Homes Sustainable?
What Makes Modular Homes Sustainable?
Green living has taken the world by storm. While some of us have decided to go green when it comes to food, shopping altogether, and transportation, there are those of us who combine it with producing our own food, using renewable power sources, and even going green with the housing.
The latter has been made possible thanks to architect designed modular homes. Due to the advancement in innovation, these homes, also called prefab, are now not only sustainable but beautiful as well, so the use of quality materials for the design isn't at the expense of aesthetics.
And no, this doesn't mean these homes all look the same, on the contrary; every project is designed and built for a specific site, so it depends on the client as well as the site requirements to come up with the result: the architect designed modular homes.
This is done through a process of consultation and collaboration with the clients as much as with engineers, contractors, and industry organisations among others, so no, no two houses are alike, they can be customised, varying in size and in style, and the materials being used.
Though some people are still skeptical about them, mostly because of the thought traditional homes built on-site are more durable and have a sturdier construction, let's just say the strength of modular homes comes exactly from being constructed in a factory. They are permanent structures!
Since it's a climate-controlled environment, they are built fast (within weeks to be exact), and there's less of a chance of weather affecting the materials or the schedule for that matter.
Less time spent constructing also implies less pollution, with reduction in the machinery and transport used, including energy and water, which is where the sustainability becomes apparent, meaning there's less impact on the environment.
Let's not forget, unlike on-site constructed homes, these homes aren't going to bother your neighbours, or block the traffic, and even if they do, it's about 90% less. Another difference is that of costs, with modular proving to be the more affordable option.
Being designed to perfection, i.e. having pre-cut materials with the necessary dimensions, makes these homes ideal for reducing waste too, more so knowing some materials can be reused for other projects, or recycled.
Thanks to the choice of low-maintenance materials, and the incorporation of features that make the homes well insulated, and efficient with the use of energy, water, and waste, they are more cost-efficient in the long run. This is something even those not that eco-aware find appealing.


In this thoroughly explained Photoshop lesson, you will see how to create diffused darken photo effect using some special Photoshop filters and tricks.
Using this thoroughly explained, detailed Photoshop lesson, I will explain to you how to create twirl background.
In this thoroughly explained photoshop lesson, you will see how to create effective color dodge photo effect on a very simple way.
In this thoroughly explained, simple photoshop lesson, you will see how to create black and white poster photo effect.
Using this thoroughly explained, detailed photoshop lesson, you will see how to create sketch photo effect.
This, step by step, detailed photoshop lesson will show you how to create cool ice effect. You can apply this effect on any photo.
Using this thoroughly explained and very simple photoshop lesson, you will see how to create glamour photo effect in few steps. This lesson is for photoshop beginners.
In this thoroughly explained, detailed flash lesson, I will show you how to create rotation text banner. You don't have to use action script code to make this lesson.
In this thoroughly explained, simple Photoshop lesson, You will see how to create fibers background in photoshop using some special photoshop tips and tricks.


text:
Genres: Music, Reality, Reality Competition
Broadcast on: M-Net, Mzansi Magic, Mzansi Wethu
M-Net 18 Jul 2010 02 Nov 2010 Sundays Unknown
The sixth season of Idols was announced by M-Net on 22 February, 2010. As in Season 5, auditionees could sing with backing musical accompaniment. Even though auditionees were still judged on their vocal abilities, prospective Idols were able to take musical instruments to the auditions.
Auditions began in Cape Town on 6 April, 2010 at the Cape Town International Convention Centre. For the first time ever, the Idols team stopped over in Bloemfontein and, after a two-season break, the judges payed a visit to Port Elizabeth as well.
All South African citizens between the ages of 16 and 30 were eligible to enter the show.
Auditions took place on the following dates:
6 April, 2010 at the Cape Town International Convention Centre
17 April, 2010 at the Gateway shopping centre
24 April, 2010 at the Sandton International Convention Centre
2 May, 2010 at the Boardwalk shopping centre
8 May, 2010 at the Windmill entertainment centre
A total of 5,394 contestants entered for the sixth season of Idols - an improvement of more than 2,000 over Season 5's entries.
After the audition phase 98 finalists were chosen to take part in "theatre week" at Sun City, which began on 27 May, 2010. The cities were represented as follows:
Cape Town: 27
Durban: 20
Johannesburg: 25
Port Elizabeth: 13
Bloemfontein: 13
The Top 98 went to Sun City to go through the theatre phase of the competition - singing solo, singing in groups, harmonising and singing with and without accompaniment.
They were whittled down to a Top 14, who were put to the public vote.
There was also a 24-hour channel on DStv. After Sunday's premiere the Idols Extra 24/7 channel launched on DStv Channel 199 and featured all the audition footage filmed from auditions everywhere.
Prizes for the winner of this season of Idols included R500,000 in cash, a new Ford Figo and a recording contract with Sony Music.
The winner of Season 6 was Elvis Blue. The runner-up was L'loyd Cele.
Liezel van der Westhuizen
Host - Herself
Host - Himself
Marah Louw
Judge - Herself
Gareth Cliff
Judge - Himself
Randall Abrahams
Freddie Van'Dango
Adeline Mocke
Contestant - Herself
Funeka Peppeta
Gail Mabalane
Jamie-Lee Sexton
Jess Yallup
S'Posh Petshwa
Sindi Nene
Zintle Mkwela
Lloyd Cele
Contestant - Himself
Pieter West
Boki Ntsime
Bongi Mthombeni
Elvis Blue
Zolani Mahola
Guest Judge (Cape Town)
Katlego Maboe
Himself, with Flip a Coin


Speakers: Capt. Barrington Irving , Dara Richardson-Heron, M.D. , Eric Schwarz , Mark J. Tamaro, P.E.
Inspiring and engaging individuals who might not consider a STEM education or career is a challenging goal. Hear firsthand from a panel of mentors and coaches about what works and how best to cultivate relationships between individuals of different generations, genders and ethnic and cultural backgrounds. The mentors will also discuss how to engage parents in their children's quests for college and career development.
Increase collaboration between the institutions that train job seekers and the companies that hire them.
Figure out better ways to align skills with jobs.
Learn the best approaches to boosting minority participation in science and math.
Highlight the role of community colleges in skill and talent development.
Identify the workforce trends of tomorrow, from advanced manufacturing to high-tech apprenticeships.
Bring to the forefront the importance of technology and computer literacy to global competitiveness.
Examine the cutting-edge thinking behind the Next Generation Science Standards.
Build effective public-private partnerships within cities, states and regions.


Sunkissed Citrus Laundry Liquid infuses your laundry with a lively blend of oranges, lemons, limes and grapefruit. Order online or call 520-981-5251 for help.
Scentsy has laundry liquid! Enzyme the grime! A powerful 6-enzyme formula attacks difficult stains while penetrating cleaning agents lift away dirt. Leaves laundry remarkably clean as it enlivens your clothes, linens and towels with signature Scentsy fragrance. 20 fl. oz. (50 medium loads).


text:
Nude in the Bath by Laurel Peterson
Nude in the Bathtub by Pierre Bonnard, b. France, 1941?
Nude in the Bath
Fragments of light, floor tiles,
the bare outline of a towel.
Like Charlene who's being divorced
and can't sell her art, giant squares
of flowers and tropical birds
in kindergarten hot pink and neon green,
and she is angry.
She had everything: a stockbroker
husband who bought her an SUV to haul
those canvases to galleries, and every morning
she woke to a studio he designed for her
bordered by windows that framed
chlorophyll greenery and the spiciness
of pink peonies and pool chlorine.
No one ever knows what really happens.
Drop the curtain, it's dark in there.
In the painting, the woman's belly is wrinkled,
her breasts a Mediterranean blue.
A small red streak blurs on the tub's edge,
and the water, it fractures left, right and centre,
rising.
Laurel Peterson
Laurel S. Peterson is a Professor of English at Norwalk Community College. Her work has been published in The Distillery, Freshwater, Pinyon, SLAB, Slant, Saranac Review, Texas Review, and others. She has published two poetry chapbooks, That's the Way the Music Sounds, from Finishing Line Press (2009) and Talking to the Mirror from The Last Automat Press (2010). She also co-edited a collection of essays on women's justice titled (Re)Interpretations: The Shapes of Justice in Women's Experience (2009). Her mystery novel, Shadow Notes, will be released by Barking Rain Press in March 2016.


Blake Shelton's persona on The Voice may lean heavy on gibes toward fellow coach Adam Levine, but Tuesday night the singer showed off his more gentle, vulnerable side with a performance of his hit "I Lived It" for the live semifinals results show. The second single off 2017's Texoma Shore, the song is an ode to rural upbringing and was written by Rhett Akins, Ashley Gorley, Ben Hayslip and Ross Copperman.
For the contestant performances, Pryor Baird tackled the Allman Brothers Band's "Soulshine" in the instant save round, but was eliminated along with Kaleb Lee in favor of 18-year-old Britton Buchanan. Team Blake's Kyla Jade and Spensha Baker, along with Team Kelly's Brynn Cartelli and Team Alicia's Buchanan will advance to the show's final four. The Voice finale begins Monday, May 21st on NBC.


Anyone headed to Google I/O next week? If so, check out the app which hit the market today and find out what goodies you have in store plus a building map of this incredible event's location. Pretty nice of the Google boys to toss together an app like this for a once a year event.
And for those of you not attending, feel free to snoop in on the action.
After taking a quick peak at the list of events, I didn't see anything screaming Froyo or Flash 10.1, but we're still expecting them to be everywhere afterwards.


As a result of its theoretical outlook, the FVDG was renamed the Free Workers' Union of Germany in 1919 and reorganized into Industrial Federations on one hand and Workers' Communities (Arbeitsbörsen) on the other. The Industrial Federations, in which all local workers in the same industry were organized, were responsible for matters relating to the workplace and the daily struggles that occurred there. The Workers' Communities represented the local organizations in the realm of popular education and cultural affairs and was responsible for defining and disseminating the Anarcho-syndicalist worldview. Here the fundamentally federalist principals of syndicalism were given full expression, as each local union had the right to participate equally in internal elections and enjoyed equal access to the economic resources of the organizations.
The means of struggle were largely economic in character, but the FAUD as a union was not content to lead struggles in this realm only to cede to the political and military force of the parties and the state. Once the proletariat had attained power through a general strike it was never again to give it up. Parliamentarianism and the use of state forms played no role in the considerations of the syndicalists--the existing political order was to be replaced with free associations of producers and consumers.
In order to effect the transition in the economic sector as smoothly as possible following the revolutionary phase, the FAUD was to constitute these forms before the general strike, and thereby guarantee control of the factories for the workers. The Workers' Communities would be reformed into a type of "statistical office" for the purpose of coordinating this process. The syndicalists made this vision concrete and thereby offered a realistic prospect for a free, socialist society while other workers' organizations followed the 'state capitalist' example of the Soviet Union, sought peace with the private sector or presented no possibilities for a socialist society. This perspective alone justifies a closer examination of the syndicalist movement.
In contrast to council communists the syndicalists placed great importance on the political questions of the day rather than waiting for conditions favourable to a revolution. The self-administration of society required that the skills and abilities necessary to this task be rehearsed and exercised. The workers' participation in daily struggles was to keep them in shape for the class struggle at large. Moreover, small victories could raise the profile of the organization. In fact, after the ebbing of the revolutionary period of 1918-1923 council communist organizations dissolved, being unable to present a relevant perspective, and many groups turned to the FAUD.
In the struggles of the Weimar Republic's infancy the syndicalists played leading roles in some regions. The FAUD grew into a mass organization and its local unions spread to almost every corner of the country, encompassing cities and villages. People of all ages found representation [in the organization]. Of the 12 sectors of industry identified by the FAUD only 5 could be covered by industrial federations, however: construction, mining, transportation, metal-working and textiles. In locales unable to gather together the mandatory 25 members for a branch organization a "Union of all Trades" was founded. The local unions were transparently and thoroughly structured: a chairperson, a representative, an auditor and two treasurers were elected to organize the tasks associated with the group's finances, correspondence and agitational activities. The Geschäftskommission in Berlin under Fritz Kater remained the executive coordinating body and was elected approximately every two years at the FAUD Congress, which also took place in Berlin until 1933. This congress was the highest decision-making body in the organization, and comprised the delegates of all the local unions.
The primary periodical organ of the FAUD was Der Syndikalist [The Syndicalist], which was published every week and was subscribed to by every member as a matter of obligation, which tied its distribution very closely to the numerical level of membership. Alongside this newspaper existed other periodicals, which were either produced on a regional level or were the organs of the industrial federations.
The local unions of the FAUD were influential in only a few areas, among them Düsseldorf (chiefly tilers), Berlin (boxmakers), or in the Ruhr region (mining). Still, the central and 'christian' trade unions showed that they had the upper hand.


text:
#include "IsaIo.h"

//
// Module Variables
//
EFI_ISA_IO_PROTOCOL mIsaIoInterface = {
  {
    IsaIoMemRead,
    IsaIoMemWrite
  },
  {
    IsaIoIoRead,
    IsaIoIoWrite
  },
  IsaIoCopyMem,
  IsaIoMap,
  IsaIoUnmap,
  IsaIoAllocateBuffer,
  IsaIoFreeBuffer,
  IsaIoFlush,
  NULL,
  0,
  NULL
};

EFI_ISA_DMA_REGISTERS  mDmaRegisters[8] = {
  {
    0x00,
    0x87,
    0x01
  },
  {
    0x02,
    0x83,
    0x03
  },
  {
    0x04,
    0x81,
    0x05
  },
  {
    0x06,
    0x82,
    0x07
  },
  {
    0x00,
    0x00,
    0x00
  },  // Channel 4 is invalid
  {
    0xC4,
    0x8B,
    0xC6
  },
  {
    0xC8,
    0x89,
    0xCA
  },
  {
    0xCC,
    0x8A,
    0xCE
  },
};

/**
  Verifies access to an ISA device

  @param[in] IsaIoDevice         The ISA device to be verified.
  @param[in] Type                The Access type. The input must be either IsaAccessTypeMem or IsaAccessTypeIo.
  @param[in] Width               The width of the memory operation.
  @param[in] Count               The number of memory operations to perform.
  @param[in] Offset              The offset in ISA memory space to start the memory operation.

  @retval EFI_SUCCESS            Verify success.
  @retval EFI_INVALID_PARAMETER  One of the parameters has an invalid value.
  @retval EFI_UNSUPPORTED        The device ont support the access type.
**/
EFI_STATUS
IsaIoVerifyAccess (
  IN ISA_IO_DEVICE              *IsaIoDevice,
  IN ISA_ACCESS_TYPE            Type,
  IN EFI_ISA_IO_PROTOCOL_WIDTH  Width,
  IN UINTN                      Count,
  IN UINT32                     Offset
  )
{
  EFI_ISA_ACPI_RESOURCE *Item;
  EFI_STATUS            Status;

  if ((UINT32)Width >= EfiIsaIoWidthMaximum ||
      Width == EfiIsaIoWidthReserved ||
      Width == EfiIsaIoWidthFifoReserved ||
      Width == EfiIsaIoWidthFillReserved
      ) {
    return EFI_INVALID_PARAMETER;
  }

  //
  // If Width is EfiIsaIoWidthFifoUintX then convert to EfiIsaIoWidthUintX
  // If Width is EfiIsaIoWidthFillUintX then convert to EfiIsaIoWidthUintX
  //
  if (Width >= EfiIsaIoWidthFifoUint8 && Width < EfiIsaIoWidthFifoReserved) {
    Count = 1;
  }

  Width = (EFI_ISA_IO_PROTOCOL_WIDTH) (Width & 0x03);

  Status  = EFI_UNSUPPORTED;
  Item    = IsaIoDevice->IsaIo.ResourceList->ResourceItem;
  while (Item->Type != EfiIsaAcpiResourceEndOfList) {
    if ((Type == IsaAccessTypeMem && Item->Type == EfiIsaAcpiResourceMemory) ||
        (Type == IsaAccessTypeIo && Item->Type == EfiIsaAcpiResourceIo)) {
      if (Offset >= Item->StartRange && (Offset + Count * (UINT32)(1 << Width)) - 1 <= Item->EndRange) {
        return EFI_SUCCESS;
      }

      if (Offset >= Item->StartRange && Offset <= Item->EndRange) {
        Status = EFI_INVALID_PARAMETER;
      }
    }

    Item++;
  }

  return Status;
}

/**
  Convert the IO Information in ACPI descriptor to IO ISA Attribute.

  @param[in] Information   The IO Information in ACPI descriptor

  @return UINT32           The IO ISA Attribute
**/
UINT32
IsaIoAttribute (
  IN UINT8                            Information
  )
{
  UINT32             Attribute;

  Attribute = 0;

  switch (Information & EFI_ACPI_IO_DECODE_MASK) {
    case EFI_ACPI_IO_DECODE_16_BIT:
      Attribute |= EFI_ISA_ACPI_IO_DECODE_16_BITS;
      break;

    case EFI_ACPI_IO_DECODE_10_BIT:
      Attribute |= EFI_ISA_ACPI_IO_DECODE_10_BITS;
      break;
  }

  return Attribute;
}

/**
  Convert the IRQ Information in ACPI descriptor to IRQ ISA Attribute.

  @param[in] Information   The IRQ Information in ACPI descriptor

  @return UINT32           The IRQ ISA Attribute
**/
UINT32
IsaIrqAttribute (
  IN UINT8                            Information
  )
{
  UINT32             Attribute;

  Attribute = 0;

  if ((Information & EFI_ACPI_IRQ_POLARITY_MASK) == EFI_ACPI_IRQ_HIGH_TRUE) {
    if ((Information & EFI_ACPI_IRQ_MODE) == EFI_ACPI_IRQ_LEVEL_TRIGGERED) {
      Attribute = EFI_ISA_ACPI_IRQ_TYPE_HIGH_TRUE_LEVEL_SENSITIVE;
    } else {
      Attribute = EFI_ISA_ACPI_IRQ_TYPE_HIGH_TRUE_EDGE_SENSITIVE;
    }
  } else {
    if ((Information & EFI_ACPI_IRQ_MODE) == EFI_ACPI_IRQ_LEVEL_TRIGGERED) {
      Attribute = EFI_ISA_ACPI_IRQ_TYPE_LOW_TRUE_LEVEL_SENSITIVE;
    } else {
      Attribute = EFI_ISA_ACPI_IRQ_TYPE_LOW_TRUE_EDGE_SENSITIVE;
    }
  }
  return Attribute;
}

/**
  Convert the Memory Information in ACPI descriptor to Memory ISA Attribute.

  @param[in] Information   The Memory Information in ACPI descriptor

  @return UINT32           The Memory ISA Attribute
**/
UINT32
IsaMemoryAttribute (
  IN UINT8                            Information
  )
{
  UINT32             Attribute;

  Attribute = 0;

  switch (Information & EFI_ACPI_MEMORY_WRITE_STATUS_MASK) {
    case EFI_ACPI_MEMORY_WRITABLE:
      Attribute |= EFI_ISA_ACPI_MEMORY_WRITEABLE;
      break;
  }

  return Attribute;
}

/**
  Convert the DMA Information in ACPI descriptor to DMA ISA Attribute.

  @param[in] Information   The DMA Information in ACPI descriptor

  @return UINT32           The DMA ISA Attribute
**/
UINT32
IsaDmaAttribute (
  IN UINT8                            Information
  )
{
  UINT32             Attribute;

  Attribute = EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SINGLE_MODE;

  switch (Information & EFI_ACPI_DMA_SPEED_TYPE_MASK) {
    case EFI_ACPI_DMA_SPEED_TYPE_COMPATIBILITY:
      Attribute |= EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SPEED_COMPATIBLE;
      break;
    case EFI_ACPI_DMA_SPEED_TYPE_A:
      Attribute |= EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SPEED_A;
      break;
    case EFI_ACPI_DMA_SPEED_TYPE_B:
      Attribute |= EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SPEED_B;
      break;
    case EFI_ACPI_DMA_SPEED_TYPE_F:
      Attribute |= EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SPEED_C;
      break;
  }

  switch (Information & EFI_ACPI_DMA_TRANSFER_TYPE_MASK) {
    case EFI_ACPI_DMA_TRANSFER_TYPE_8_BIT:
      Attribute |= EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_WIDTH_8;
      break;
    case EFI_ACPI_DMA_TRANSFER_TYPE_16_BIT:
      Attribute |= EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_WIDTH_16;
      break;
  }

  return Attribute;
}

/**
  Convert the ACPI resource descriptor to ISA resource descriptor.

  @param[in]  AcpiResource          Pointer to the ACPI resource descriptor
  @param[out] IsaResource           The optional pointer to the buffer to
                                    store the converted ISA resource descriptor

  @return     UINTN                 Number of ISA resource descriptor needed
**/
UINTN
AcpiResourceToIsaResource (
  IN  ACPI_RESOURCE_HEADER_PTR        AcpiResource,
  OUT EFI_ISA_ACPI_RESOURCE           *IsaResource   OPTIONAL
  )
{
  UINT32                                        Index;
  UINTN                                         Count;
  UINT32                                        LastIndex;
  EFI_ACPI_IO_PORT_DESCRIPTOR                   *Io;
  EFI_ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR    *FixedIo;
  EFI_ACPI_IRQ_DESCRIPTOR                       *Irq;
  EFI_ACPI_DMA_DESCRIPTOR                       *Dma;
  EFI_ACPI_32_BIT_MEMORY_RANGE_DESCRIPTOR       *Memory;
  EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR *FixedMemory;

  Count     = 0;
  LastIndex = 0;

  switch (AcpiResource.SmallHeader->Byte) {
    case ACPI_DMA_DESCRIPTOR:
      Dma = (EFI_ACPI_DMA_DESCRIPTOR *) AcpiResource.SmallHeader;
      for (Index = 0; Index < sizeof (Dma->ChannelMask) * 8; Index++) {
        if (Dma->ChannelMask & (1 << Index)) {
          if ((Count > 0) && (LastIndex + 1 == Index)) {
            if (IsaResource != NULL) {
              IsaResource[Count - 1].EndRange ++;
            }
          } else {
            if (IsaResource != NULL) {
              IsaResource[Count].Type       = EfiIsaAcpiResourceDma;
              IsaResource[Count].Attribute  = IsaDmaAttribute (Dma->Information);
              IsaResource[Count].StartRange = Index;
              IsaResource[Count].EndRange   = Index;
            }
            Count ++;
          }

          LastIndex = Index;
        }
      }
      break;

    case ACPI_IO_PORT_DESCRIPTOR:
      Io = (EFI_ACPI_IO_PORT_DESCRIPTOR *) AcpiResource.SmallHeader;
      if (Io->Length != 0) {
        if (IsaResource != NULL) {
          IsaResource[Count].Type       = EfiIsaAcpiResourceIo;
          IsaResource[Count].Attribute  = IsaIoAttribute (Io->Information);
          IsaResource[Count].StartRange = Io->BaseAddressMin;
          IsaResource[Count].EndRange   = Io->BaseAddressMin + Io->Length - 1;
        }
        Count ++;
      }
      break;

    case ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR:
      FixedIo = (EFI_ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR *) AcpiResource.SmallHeader;
      if (FixedIo->Length != 0) {
        if (IsaResource != NULL) {
          IsaResource[Count].Type       = EfiIsaAcpiResourceIo;
          IsaResource[Count].Attribute  = EFI_ISA_ACPI_IO_DECODE_10_BITS;
          IsaResource[Count].StartRange = FixedIo->BaseAddress;
          IsaResource[Count].EndRange   = FixedIo->BaseAddress + FixedIo->Length - 1;
        }
        Count ++;
      }
      break;

    case ACPI_IRQ_DESCRIPTOR:
    case ACPI_IRQ_NOFLAG_DESCRIPTOR:
      Irq = (EFI_ACPI_IRQ_DESCRIPTOR *) AcpiResource.SmallHeader;
      for (Index = 0; Index < sizeof (Irq->Mask) * 8; Index++) {
        if (Irq->Mask & (1 << Index)) {
          if ((Count > 0) && (LastIndex + 1 == Index)) {
            if (IsaResource != NULL) {
              IsaResource[Count - 1].EndRange ++;
            }
          } else {
            if (IsaResource != NULL) {
              IsaResource[Count].Type       = EfiIsaAcpiResourceInterrupt;
              if (AcpiResource.SmallHeader->Byte == ACPI_IRQ_DESCRIPTOR) {
                IsaResource[Count].Attribute = IsaIrqAttribute (Irq->Information);
              } else {
                IsaResource[Count].Attribute  = EFI_ISA_ACPI_IRQ_TYPE_HIGH_TRUE_EDGE_SENSITIVE;
              }
              IsaResource[Count].StartRange = Index;
              IsaResource[Count].EndRange   = Index;
            }
            Count++;
          }

          LastIndex = Index;
        }
      }
      break;

    case ACPI_32_BIT_MEMORY_RANGE_DESCRIPTOR:
      Memory = (EFI_ACPI_32_BIT_MEMORY_RANGE_DESCRIPTOR *) AcpiResource.LargeHeader;
      if (Memory->Length != 0) {
        if (IsaResource != NULL) {
          IsaResource[Count].Type       = EfiIsaAcpiResourceMemory;
          IsaResource[Count].Attribute  = IsaMemoryAttribute (Memory->Information);
          IsaResource[Count].StartRange = Memory->BaseAddressMin;
          IsaResource[Count].EndRange   = Memory->BaseAddressMin + Memory->Length - 1;
        }
        Count ++;
      }
      break;

    case ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR:
      FixedMemory = (EFI_ACPI_32_BIT_FIXED_MEMORY_RANGE_DESCRIPTOR *) AcpiResource.LargeHeader;
      if (FixedMemory->Length != 0) {
        if (IsaResource != NULL) {
          IsaResource[Count].Type       = EfiIsaAcpiResourceMemory;
          IsaResource[Count].Attribute  = IsaMemoryAttribute (FixedMemory->Information);
          IsaResource[Count].StartRange = FixedMemory->BaseAddress;
          IsaResource[Count].EndRange   = FixedMemory->BaseAddress + FixedMemory->Length - 1;
        }
        Count ++;
      }
      break;

    case ACPI_END_TAG_DESCRIPTOR:
      if (IsaResource != NULL) {
        IsaResource[Count].Type       = EfiIsaAcpiResourceEndOfList;
        IsaResource[Count].Attribute  = 0;
        IsaResource[Count].StartRange = 0;
        IsaResource[Count].EndRange   = 0;
      }
      Count ++;
      break;
  }

  return Count;
}

/**
  Initializes an ISA I/O Instance

  @param[in] IsaIoDevice            The isa device to be initialized.
  @param[in] DevicePath             The device path of the isa device.
  @param[in] Resources              The ACPI resource list.

**/
VOID
InitializeIsaIoInstance (
  IN ISA_IO_DEVICE               *IsaIoDevice,
  IN EFI_DEVICE_PATH_PROTOCOL    *DevicePath,
  IN ACPI_RESOURCE_HEADER_PTR    Resources
  )
{
  UINTN                                       Index;
  ACPI_HID_DEVICE_PATH                        *AcpiNode;
  ACPI_RESOURCE_HEADER_PTR                    ResourcePtr;

  //
  // Use the ISA IO Protocol structure template to initialize the ISA IO instance
  //
  CopyMem (
    &IsaIoDevice->IsaIo,
    &mIsaIoInterface,
    sizeof (EFI_ISA_IO_PROTOCOL)
    );

  //
  // Count the resources including the ACPI End Tag
  //
  ResourcePtr = Resources;
  Index       = 0;
  while (ResourcePtr.SmallHeader->Byte != ACPI_END_TAG_DESCRIPTOR) {

    Index += AcpiResourceToIsaResource (ResourcePtr, NULL);

    if (ResourcePtr.SmallHeader->Bits.Type == 0) {
      ResourcePtr.SmallHeader = (ACPI_SMALL_RESOURCE_HEADER *) ((UINT8 *) ResourcePtr.SmallHeader
                              + ResourcePtr.SmallHeader->Bits.Length
                              + sizeof (*ResourcePtr.SmallHeader));
    } else {
      ResourcePtr.LargeHeader = (ACPI_LARGE_RESOURCE_HEADER *) ((UINT8 *) ResourcePtr.LargeHeader
                              + ResourcePtr.LargeHeader->Length
                              + sizeof (*ResourcePtr.LargeHeader));
    }

  }
  //
  // Get the Isa Resource count for ACPI End Tag
  //
  Index += AcpiResourceToIsaResource (ResourcePtr, NULL);

  //
  // Initialize the ResourceList
  //
  IsaIoDevice->IsaIo.ResourceList = AllocatePool (sizeof (EFI_ISA_ACPI_RESOURCE_LIST) + Index * sizeof (EFI_ISA_ACPI_RESOURCE));
  ASSERT (IsaIoDevice->IsaIo.ResourceList != NULL);
  IsaIoDevice->IsaIo.ResourceList->ResourceItem = (EFI_ISA_ACPI_RESOURCE *) (IsaIoDevice->IsaIo.ResourceList + 1);

  AcpiNode = (ACPI_HID_DEVICE_PATH *) ((UINT8 *) DevicePath + GetDevicePathSize (DevicePath) - END_DEVICE_PATH_LENGTH - sizeof (ACPI_HID_DEVICE_PATH));
  IsaIoDevice->IsaIo.ResourceList->Device.HID = AcpiNode->HID;
  IsaIoDevice->IsaIo.ResourceList->Device.UID = AcpiNode->UID;

  ResourcePtr = Resources;
  Index       = 0;
  while (ResourcePtr.SmallHeader->Byte != ACPI_END_TAG_DESCRIPTOR) {

    Index += AcpiResourceToIsaResource (ResourcePtr, &IsaIoDevice->IsaIo.ResourceList->ResourceItem[Index]);

    if (ResourcePtr.SmallHeader->Bits.Type == 0) {
      ResourcePtr.SmallHeader = (ACPI_SMALL_RESOURCE_HEADER *) ((UINT8 *) ResourcePtr.SmallHeader
                              + ResourcePtr.SmallHeader->Bits.Length
                              + sizeof (*ResourcePtr.SmallHeader));
    } else {
      ResourcePtr.LargeHeader = (ACPI_LARGE_RESOURCE_HEADER *) ((UINT8 *) ResourcePtr.LargeHeader
                              + ResourcePtr.LargeHeader->Length
                              + sizeof (*ResourcePtr.LargeHeader));
    }
  }

  //
  // Convert the ACPI End Tag
  //
  AcpiResourceToIsaResource (ResourcePtr, &IsaIoDevice->IsaIo.ResourceList->ResourceItem[Index]);
}

/**
  Performs an ISA I/O Read Cycle

  @param[in]  This              A pointer to the EFI_ISA_IO_PROTOCOL instance.
  @param[in]  Width             Specifies the width of the I/O operation.
  @param[in]  Offset            The offset in ISA I/O space to start the I/O operation.
  @param[in]  Count             The number of I/O operations to perform.
  @param[out] Buffer            The destination buffer to store the results

  @retval EFI_SUCCESS           The data was read from the device sucessfully.
  @retval EFI_UNSUPPORTED       The Offset is not valid for this device.
  @retval EFI_INVALID_PARAMETER Width or Count, or both, were invalid.
  @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of resources.
**/
EFI_STATUS
EFIAPI
IsaIoIoRead (
  IN  EFI_ISA_IO_PROTOCOL        *This,
  IN  EFI_ISA_IO_PROTOCOL_WIDTH  Width,
  IN  UINT32                     Offset,
  IN  UINTN                      Count,
  OUT VOID                       *Buffer
  )
{
  EFI_STATUS    Status;
  ISA_IO_DEVICE *IsaIoDevice;

  IsaIoDevice = ISA_IO_DEVICE_FROM_ISA_IO_THIS (This);

  //
  // Verify Isa IO Access
  //
  Status = IsaIoVerifyAccess (
             IsaIoDevice,
             IsaAccessTypeIo,
             Width,
             Count,
             Offset
             );
  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = IsaIoDevice->PciIo->Io.Read (
                                    IsaIoDevice->PciIo,
                                    (EFI_PCI_IO_PROTOCOL_WIDTH) Width,
                                    EFI_PCI_IO_PASS_THROUGH_BAR,
                                    Offset,
                                    Count,
                                    Buffer
                                    );

  if (EFI_ERROR (Status)) {
    REPORT_STATUS_CODE (
      EFI_ERROR_CODE | EFI_ERROR_MINOR,
      EFI_IO_BUS_LPC | EFI_IOB_EC_CONTROLLER_ERROR
      );
  }

  return Status;
}

/**
  Performs an ISA I/O Write Cycle

  @param[in] This                A pointer to the EFI_ISA_IO_PROTOCOL instance.
  @param[in] Width               Specifies the width of the I/O operation.
  @param[in] Offset              The offset in ISA I/O space to start the I/O operation.
  @param[in] Count               The number of I/O operations to perform.
  @param[in] Buffer              The source buffer to write data from

  @retval EFI_SUCCESS            The data was writen to the device sucessfully.
  @retval EFI_UNSUPPORTED        The Offset is not valid for this device.
  @retval EFI_INVALID_PARAMETER  Width or Count, or both, were invalid.
  @retval EFI_OUT_OF_RESOURCES   The request could not be completed due to a lack of resources.
**/
EFI_STATUS
EFIAPI
IsaIoIoWrite (
  IN EFI_ISA_IO_PROTOCOL        *This,
  IN EFI_ISA_IO_PROTOCOL_WIDTH  Width,
  IN UINT32                     Offset,
  IN UINTN                      Count,
  IN VOID                       *Buffer
  )
{
  EFI_STATUS    Status;
  ISA_IO_DEVICE *IsaIoDevice;

  IsaIoDevice = ISA_IO_DEVICE_FROM_ISA_IO_THIS (This);

  //
  // Verify Isa IO Access
  //
  Status = IsaIoVerifyAccess (
             IsaIoDevice,
             IsaAccessTypeIo,
             Width,
             Count,
             Offset
             );
  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = IsaIoDevice->PciIo->Io.Write (
                                    IsaIoDevice->PciIo,
                                    (EFI_PCI_IO_PROTOCOL_WIDTH) Width,
                                    EFI_PCI_IO_PASS_THROUGH_BAR,
                                    Offset,
                                    Count,
                                    Buffer
                                    );

  if (EFI_ERROR (Status)) {
    REPORT_STATUS_CODE (
      EFI_ERROR_CODE | EFI_ERROR_MINOR,
      EFI_IO_BUS_LPC | EFI_IOB_EC_CONTROLLER_ERROR
      );
  }

  return Status;
}

/**
  Writes an 8-bit I/O Port

  @param[in] This                A pointer to the EFI_ISA_IO_PROTOCOL instance.
  @param[in] Offset              The offset in ISA IO space to start the IO operation.
  @param[in] Value               The data to write port.

  @retval EFI_SUCCESS            Success.
  @retval EFI_INVALID_PARAMETER  Parameter is invalid.
  @retval EFI_UNSUPPORTED        The address range specified by Offset is not valid.
  @retval EFI_OUT_OF_RESOURCES   The request could not be completed due to a lack of resources.
**/
EFI_STATUS
WritePort (
  IN EFI_ISA_IO_PROTOCOL  *This,
  IN UINT32               Offset,
  IN UINT8                Value
  )
{
  EFI_STATUS    Status;
  ISA_IO_DEVICE *IsaIoDevice;

  IsaIoDevice = ISA_IO_DEVICE_FROM_ISA_IO_THIS (This);

  Status = IsaIoDevice->PciIo->Io.Write (
                                    IsaIoDevice->PciIo,
                                    EfiPciIoWidthUint8,
                                    EFI_PCI_IO_PASS_THROUGH_BAR,
                                    Offset,
                                    1,
                                    &Value
                                    );
  if (EFI_ERROR (Status)) {
    REPORT_STATUS_CODE (
      EFI_ERROR_CODE | EFI_ERROR_MINOR,
      EFI_IO_BUS_LPC | EFI_IOB_EC_CONTROLLER_ERROR
      );
    return Status;
  }

  //
  // Wait for 50 microseconds to take affect.
  //
  gBS->Stall (50);

  return EFI_SUCCESS;
}

/**
  Writes I/O operation base address and count number to a 8 bit I/O Port.

  @param[in] This                A pointer to the EFI_ISA_IO_PROTOCOL instance.
  @param[in] AddrOffset          The address' offset.
  @param[in] PageOffset          The page's offest.
  @param[in] CountOffset         The count's offset.
  @param[in] BaseAddress         The base address.
  @param[in] Count               The number of I/O operations to perform.

  @retval EFI_SUCCESS            Success.
  @retval EFI_INVALID_PARAMETER  Parameter is invalid.
  @retval EFI_UNSUPPORTED        The address range specified by these Offsets and Count is not valid.
  @retval EFI_OUT_OF_RESOURCES   The request could not be completed due to a lack of resources.
**/
EFI_STATUS
WriteDmaPort (
  IN EFI_ISA_IO_PROTOCOL  *This,
  IN UINT32               AddrOffset,
  IN UINT32               PageOffset,
  IN UINT32               CountOffset,
  IN UINT32               BaseAddress,
  IN UINT16               Count
  )
{
  EFI_STATUS  Status;

  Status = WritePort (This, AddrOffset, (UINT8) (BaseAddress & 0xff));
  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = WritePort (This, AddrOffset, (UINT8) ((BaseAddress >> 8) & 0xff));
  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = WritePort (This, PageOffset, (UINT8) ((BaseAddress >> 16) & 0xff));
  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = WritePort (This, CountOffset, (UINT8) (Count & 0xff));
  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = WritePort (This, CountOffset, (UINT8) ((Count >> 8) & 0xff));
  return Status;
}

/**
  Unmaps a memory region for DMA

  @param[in] This           A pointer to the EFI_ISA_IO_PROTOCOL instance.
  @param[in] Mapping        The mapping value returned from EFI_ISA_IO.Map().

  @retval EFI_SUCCESS       The range was unmapped.
  @retval EFI_DEVICE_ERROR  The data was not committed to the target system memory.
**/
EFI_STATUS
EFIAPI
IsaIoUnmap (
  IN EFI_ISA_IO_PROTOCOL  *This,
  IN VOID                 *Mapping
  )
{
  ISA_MAP_INFO  *IsaMapInfo;

  //
  // Check if DMA is supported.
  //
  if ((PcdGet8 (PcdIsaBusSupportedFeatures) & PCD_ISA_BUS_SUPPORT_DMA) == 0) {
    return EFI_UNSUPPORTED;
  }

  //
  // See if the Map() operation associated with this Unmap() required a mapping
  // buffer.If a mapping buffer was not required, then this function simply
  // returns EFI_SUCCESS.
  //
  if (Mapping != NULL) {
    //
    // Get the MAP_INFO structure from Mapping
    //
    IsaMapInfo = (ISA_MAP_INFO *) Mapping;

    //
    // If this is a write operation from the Agent's point of view,
    // then copy the contents of the mapped buffer into the real buffer
    // so the processor can read the contents of the real buffer.
    //
    if (IsaMapInfo->Operation == EfiIsaIoOperationBusMasterWrite) {
      CopyMem (
        (VOID *) (UINTN) IsaMapInfo->HostAddress,
        (VOID *) (UINTN) IsaMapInfo->MappedHostAddress,
        IsaMapInfo->NumberOfBytes
        );
    }
    //
    // Free the mapped buffer and the MAP_INFO structure.
    //
    gBS->FreePages (IsaMapInfo->MappedHostAddress, IsaMapInfo->NumberOfPages);
    FreePool (IsaMapInfo);
  }

  return EFI_SUCCESS;
}

/**
  Flushes any posted write data to the system memory.

  @param[in] This             A pointer to the EFI_ISA_IO_PROTOCOL instance.

  @retval  EFI_SUCCESS        The buffers were flushed.
  @retval  EFI_DEVICE_ERROR   The buffers were not flushed due to a hardware error.
**/
EFI_STATUS
EFIAPI
IsaIoFlush (
  IN EFI_ISA_IO_PROTOCOL  *This
  )
{
  EFI_STATUS    Status;
  ISA_IO_DEVICE *IsaIoDevice;

  IsaIoDevice = ISA_IO_DEVICE_FROM_ISA_IO_THIS (This);

  Status = IsaIoDevice->PciIo->Flush (IsaIoDevice->PciIo);

  if (EFI_ERROR (Status)) {
    REPORT_STATUS_CODE (
      EFI_ERROR_CODE | EFI_ERROR_MINOR,
      EFI_IO_BUS_LPC | EFI_IOB_EC_CONTROLLER_ERROR
      );
  }

  return Status;
}

/**
  Performs an ISA Memory Read Cycle

  @param[in]  This               A pointer to the EFI_ISA_IO_PROTOCOL instance.
  @param[in]  Width              Specifies the width of the memory operation.
  @param[in]  Offset             The offset in ISA memory space to start the memory operation.
  @param[in]  Count              The number of memory operations to perform.
  @param[out] Buffer             The destination buffer to store the results

  @retval EFI_SUCCESS            The data was read from the device successfully.
  @retval EFI_UNSUPPORTED        The Offset is not valid for this device.
  @retval EFI_INVALID_PARAMETER  Width or Count, or both, were invalid.
  @retval EFI_OUT_OF_RESOURCES   The request could not be completed due to a lack of resources.
**/
EFI_STATUS
EFIAPI
IsaIoMemRead (
  IN  EFI_ISA_IO_PROTOCOL        *This,
  IN  EFI_ISA_IO_PROTOCOL_WIDTH  Width,
  IN  UINT32                     Offset,
  IN  UINTN                      Count,
  OUT VOID                       *Buffer
  )
{
  EFI_STATUS    Status;
  ISA_IO_DEVICE *IsaIoDevice;

  //
  // Check if ISA memory is supported.
  //
  if ((PcdGet8 (PcdIsaBusSupportedFeatures) & PCD_ISA_BUS_SUPPORT_ISA_MEMORY) == 0) {
    return EFI_UNSUPPORTED;
  }

  IsaIoDevice = ISA_IO_DEVICE_FROM_ISA_IO_THIS (This);

  //
  // Verify the Isa Io Access
  //
  Status = IsaIoVerifyAccess (
             IsaIoDevice,
             IsaAccessTypeMem,
             Width,
             Count,
             Offset
             );
  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = IsaIoDevice->PciIo->Mem.Read (
                                     IsaIoDevice->PciIo,
                                     (EFI_PCI_IO_PROTOCOL_WIDTH) Width,
                                     EFI_PCI_IO_PASS_THROUGH_BAR,
                                     Offset,
                                     Count,
                                     Buffer
                                     );

  if (EFI_ERROR (Status)) {
    REPORT_STATUS_CODE (
      EFI_ERROR_CODE | EFI_ERROR_MINOR,
      EFI_IO_BUS_LPC | EFI_IOB_EC_CONTROLLER_ERROR
      );
  }

  return Status;
}

/**
  Performs an ISA Memory Write Cycle

  @param[in] This                A pointer to the EFI_ISA_IO_PROTOCOL instance.
  @param[in] Width               Specifies the width of the memory operation.
  @param[in] Offset              The offset in ISA memory space to start the memory operation.
  @param[in] Count               The number of memory operations to perform.
  @param[in] Buffer              The source buffer to write data from

  @retval EFI_SUCCESS            The data was written to the device sucessfully.
  @retval EFI_UNSUPPORTED        The Offset is not valid for this device.
  @retval EFI_INVALID_PARAMETER  Width or Count, or both, were invalid.
  @retval EFI_OUT_OF_RESOURCES   The request could not be completed due to a lack of resources.
**/
EFI_STATUS
EFIAPI
IsaIoMemWrite (
  IN EFI_ISA_IO_PROTOCOL        *This,
  IN EFI_ISA_IO_PROTOCOL_WIDTH  Width,
  IN UINT32                     Offset,
  IN UINTN                      Count,
  IN VOID                       *Buffer
  )
{
  EFI_STATUS    Status;
  ISA_IO_DEVICE *IsaIoDevice;

  //
  // Check if ISA memory is supported.
  //
  if ((PcdGet8 (PcdIsaBusSupportedFeatures) & PCD_ISA_BUS_SUPPORT_ISA_MEMORY) == 0) {
    return EFI_UNSUPPORTED;
  }

  IsaIoDevice = ISA_IO_DEVICE_FROM_ISA_IO_THIS (This);

  //
  // Verify Isa IO Access
  //
  Status = IsaIoVerifyAccess (
             IsaIoDevice,
             IsaAccessTypeMem,
             Width,
             Count,
             Offset
             );
  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = IsaIoDevice->PciIo->Mem.Write (
                                     IsaIoDevice->PciIo,
                                     (EFI_PCI_IO_PROTOCOL_WIDTH) Width,
                                     EFI_PCI_IO_PASS_THROUGH_BAR,
                                     Offset,
                                     Count,
                                     Buffer
                                     );

  if (EFI_ERROR (Status)) {
    REPORT_STATUS_CODE (
      EFI_ERROR_CODE | EFI_ERROR_MINOR,
      EFI_IO_BUS_LPC | EFI_IOB_EC_CONTROLLER_ERROR
      );
  }

  return Status;
}

/**
  Copy one region of ISA memory space to another region of ISA memory space on the ISA controller.

  @param[in]  This               A pointer to the EFI_ISA_IO_PROTOCOL instance.
  @param[in]  Width              Specifies the width of the memory copy operation.
  @param[in]  DestOffset         The offset of the destination
  @param[in]  SrcOffset          The offset of the source
  @param[in]  Count              The number of memory copy  operations to perform

  @retval EFI_SUCCESS            The data was copied sucessfully.
  @retval EFI_UNSUPPORTED        The DestOffset or SrcOffset is not valid for this device.
  @retval EFI_INVALID_PARAMETER  Width or Count, or both, were invalid.
  @retval EFI_OUT_OF_RESOURCES   The request could not be completed due to a lack of resources.
**/
EFI_STATUS
EFIAPI
IsaIoCopyMem (
  IN EFI_ISA_IO_PROTOCOL        *This,
  IN EFI_ISA_IO_PROTOCOL_WIDTH  Width,
  IN UINT32                     DestOffset,
  IN UINT32                     SrcOffset,
  IN UINTN                      Count
  )
{
  EFI_STATUS    Status;
  ISA_IO_DEVICE *IsaIoDevice;

  //
  // Check if ISA memory is supported.
  //
  if ((PcdGet8 (PcdIsaBusSupportedFeatures) & PCD_ISA_BUS_SUPPORT_ISA_MEMORY) == 0) {
    return EFI_UNSUPPORTED;
  }

  IsaIoDevice = ISA_IO_DEVICE_FROM_ISA_IO_THIS (This);

  //
  // Verify Isa IO Access for destination and source
  //
  Status = IsaIoVerifyAccess (
             IsaIoDevice,
             IsaAccessTypeMem,
             Width,
             Count,
             DestOffset
             );
  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = IsaIoVerifyAccess (
             IsaIoDevice,
             IsaAccessTypeMem,
             Width,
             Count,
             SrcOffset
             );
  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = IsaIoDevice->PciIo->CopyMem (
                                 IsaIoDevice->PciIo,
                                 (EFI_PCI_IO_PROTOCOL_WIDTH) Width,
                                 EFI_PCI_IO_PASS_THROUGH_BAR,
                                 DestOffset,
                                 EFI_PCI_IO_PASS_THROUGH_BAR,
                                 SrcOffset,
                                 Count
                                 );

  if (EFI_ERROR (Status)) {
    REPORT_STATUS_CODE (
      EFI_ERROR_CODE | EFI_ERROR_MINOR,
      EFI_IO_BUS_LPC | EFI_IOB_EC_CONTROLLER_ERROR
      );
  }

  return Status;
}

/**
  Maps a memory region for DMA, note this implementation
  only supports slave read/write operation to save code size.

  @param This                    A pointer to the EFI_ISA_IO_PROTOCOL instance.
  @param Operation               Indicates the type of DMA (slave or bus master), and if
                                 the DMA operation is going to read or write to system memory.
  @param ChannelNumber           The slave channel number to use for this DMA operation.
                                 If Operation and ChannelAttributes shows that this device
                                 performs bus mastering DMA, then this field is ignored.
                                 The legal range for this field is 0..7.
  @param ChannelAttributes       The attributes of the DMA channel to use for this DMA operation
  @param HostAddress             The system memory address to map to the device.
  @param NumberOfBytes           On input the number of bytes to map.  On output the number
                                 of bytes that were mapped.
  @param DeviceAddress           The resulting map address for the bus master device to use
                                 to access the hosts HostAddress.
  @param Mapping                 A resulting value to pass to EFI_ISA_IO.Unmap().

  @retval EFI_SUCCESS            The range was mapped for the returned NumberOfBytes.
  @retval EFI_INVALID_PARAMETER  The Operation or HostAddress is undefined.
  @retval EFI_UNSUPPORTED        The HostAddress can not be mapped as a common buffer.
  @retval EFI_DEVICE_ERROR       The system hardware could not map the requested address.
  @retval EFI_OUT_OF_RESOURCES   The memory pages could not be allocated.
**/
EFI_STATUS
IsaIoMapOnlySupportSlaveReadWrite (
  IN     EFI_ISA_IO_PROTOCOL            *This,
  IN     EFI_ISA_IO_PROTOCOL_OPERATION  Operation,
  IN     UINT8                          ChannelNumber  OPTIONAL,
  IN     UINT32                         ChannelAttributes,
  IN     VOID                           *HostAddress,
  IN OUT UINTN                          *NumberOfBytes,
  OUT    EFI_PHYSICAL_ADDRESS           *DeviceAddress,
  OUT    VOID                           **Mapping
  )
{
  EFI_STATUS            Status;
  EFI_PHYSICAL_ADDRESS  PhysicalAddress;
  ISA_MAP_INFO          *IsaMapInfo;
  UINT8                 DmaMode;
  UINTN                 MaxNumberOfBytes;
  UINT32                BaseAddress;
  UINT16                Count;
  UINT8                 DmaMask;
  UINT8                 DmaClear;
  UINT8                 DmaChannelMode;

  if ((NULL == This) ||
      (NULL == HostAddress) ||
      (NULL == NumberOfBytes) ||
      (NULL == DeviceAddress) ||
      (NULL == Mapping)
      ) {
    return EFI_INVALID_PARAMETER;
  }

  //
  // Initialize the return values to their defaults
  //
  *Mapping = NULL;

  //
  // Make sure the Operation parameter is valid.
  // Light IsaIo only supports two operations.
  //
  if (!(Operation == EfiIsaIoOperationSlaveRead ||
        Operation == EfiIsaIoOperationSlaveWrite)) {
    return EFI_INVALID_PARAMETER;
  }

  if (ChannelNumber >= 4) {
    //
    // The Light IsaIo doesn't support channelNumber larger than 4.
    //
    return EFI_INVALID_PARAMETER;
  }

  //
  // Map the HostAddress to a DeviceAddress.
  //
  PhysicalAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) HostAddress;
  if ((PhysicalAddress + *NumberOfBytes) > BASE_16MB) {
    //
    // Common Buffer operations can not be remapped.  If the common buffer
    // is above 16MB, then it is not possible to generate a mapping, so return
    // an error.
    //
    if (Operation == EfiIsaIoOperationBusMasterCommonBuffer) {
      return EFI_UNSUPPORTED;
    }
    //
    // Allocate an ISA_MAP_INFO structure to remember the mapping when Unmap()
    // is called later.
    //
    IsaMapInfo = AllocatePool (sizeof (ISA_MAP_INFO));
    if (IsaMapInfo == NULL) {
      *NumberOfBytes = 0;
      return EFI_OUT_OF_RESOURCES;
    }
    //
    // Return a pointer to the MAP_INFO structure in Mapping
    //
    *Mapping = IsaMapInfo;

    //
    // Initialize the MAP_INFO structure
    //
    IsaMapInfo->Operation         = Operation;
    IsaMapInfo->NumberOfBytes     = *NumberOfBytes;
    IsaMapInfo->NumberOfPages     = EFI_SIZE_TO_PAGES (*NumberOfBytes);
    IsaMapInfo->HostAddress       = PhysicalAddress;
    IsaMapInfo->MappedHostAddress = BASE_16MB - 1;

    //
    // Allocate a buffer below 16MB to map the transfer to.
    //
    Status = gBS->AllocatePages (
                    AllocateMaxAddress,
                    EfiBootServicesData,
                    IsaMapInfo->NumberOfPages,
                    &IsaMapInfo->MappedHostAddress
                    );
    if (EFI_ERROR (Status)) {
      FreePool (IsaMapInfo);
      *NumberOfBytes  = 0;
      *Mapping        = NULL;
      return Status;
    }
    //
    // If this is a read operation from the DMA agents's point of view,
    // then copy the contents of the real buffer into the mapped buffer
    // so the DMA agent can read the contents of the real buffer.
    //
    if (Operation == EfiIsaIoOperationSlaveRead) {
      CopyMem (
        (VOID *) (UINTN) IsaMapInfo->MappedHostAddress,
        (VOID *) (UINTN) IsaMapInfo->HostAddress,
        IsaMapInfo->NumberOfBytes
        );
    }
    //
    // The DeviceAddress is the address of the maped buffer below 16 MB
    //
    *DeviceAddress = IsaMapInfo->MappedHostAddress;
  } else {
    //
    // The transfer is below 16 MB, so the DeviceAddress is simply the
    // HostAddress
    //
    *DeviceAddress = PhysicalAddress;
  }

  //
  // Figure out what to program into the DMA Channel Mode Register
  //
  DmaMode = (UINT8) (B_8237_DMA_CHMODE_INCREMENT | (ChannelNumber & 0x03));
  if (Operation == EfiIsaIoOperationSlaveRead) {
    DmaMode |= V_8237_DMA_CHMODE_MEM2IO;
  } else {
    DmaMode |= V_8237_DMA_CHMODE_IO2MEM;
  }
  //
  // We only support EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SINGLE_MODE in simplified IsaIo
  //
  DmaMode |= V_8237_DMA_CHMODE_SINGLE;

  //
  // A Slave DMA transfer can not cross a 64K boundary.
  // Compute *NumberOfBytes based on this restriction.
  //
  MaxNumberOfBytes = 0x10000 - ((UINT32) (*DeviceAddress) & 0xffff);
  if (*NumberOfBytes > MaxNumberOfBytes) {
    *NumberOfBytes = MaxNumberOfBytes;
  }
  //
  // Compute the values to program into the BaseAddress and Count registers
  // of the Slave DMA controller
  //
  BaseAddress = (UINT32) (*DeviceAddress);
  Count       = (UINT16) (*NumberOfBytes - 1);
  //
  // Program the DMA Write Single Mask Register for ChannelNumber
  // Clear the DMA Byte Pointer Register
  //
  DmaMask         = R_8237_DMA_WRSMSK_CH0_3;
  DmaClear        = R_8237_DMA_CBPR_CH0_3;
  DmaChannelMode  = R_8237_DMA_CHMODE_CH0_3;

  Status = WritePort (
             This,
             DmaMask,
             (UINT8) (B_8237_DMA_WRSMSK_CMS | (ChannelNumber & 0x03))
             );
  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = WritePort (
             This,
             DmaClear,
             (UINT8) (B_8237_DMA_WRSMSK_CMS | (ChannelNumber & 0x03))
             );
  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = WritePort (This, DmaChannelMode, DmaMode);
  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = WriteDmaPort (
             This,
             mDmaRegisters[ChannelNumber].Address,
             mDmaRegisters[ChannelNumber].Page,
             mDmaRegisters[ChannelNumber].Count,
             BaseAddress,
             Count
             );
  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = WritePort (
             This,
             DmaMask,
             (UINT8) (ChannelNumber & 0x03)
             );
  if (EFI_ERROR (Status)) {
    return Status;
  }

  return EFI_SUCCESS;
}

/**
  Maps a memory region for DMA. This implementation implement the
  the full mapping support.

  @param This                    A pointer to the EFI_ISA_IO_PROTOCOL instance.
  @param Operation               Indicates the type of DMA (slave or bus master), and if
                                 the DMA operation is going to read or write to system memory.
  @param ChannelNumber           The slave channel number to use for this DMA operation.
                                 If Operation and ChannelAttributes shows that this device
                                 performs bus mastering DMA, then this field is ignored.
                                 The legal range for this field is 0..7.
  @param ChannelAttributes       The attributes of the DMA channel to use for this DMA operation
  @param HostAddress             The system memory address to map to the device.
  @param NumberOfBytes           On input the number of bytes to map.  On output the number
                                 of bytes that were mapped.
  @param DeviceAddress           The resulting map address for the bus master device to use
                                 to access the hosts HostAddress.
  @param Mapping                 A resulting value to pass to EFI_ISA_IO.Unmap().

  @retval EFI_SUCCESS           - The range was mapped for the returned NumberOfBytes.
  @retval EFI_INVALID_PARAMETER - The Operation or HostAddress is undefined.
  @retval EFI_UNSUPPORTED       - The HostAddress can not be mapped as a common buffer.
  @retval EFI_DEVICE_ERROR      - The system hardware could not map the requested address.
  @retval EFI_OUT_OF_RESOURCES  - The memory pages could not be allocated.
**/
EFI_STATUS
IsaIoMapFullSupport (
  IN     EFI_ISA_IO_PROTOCOL                                  *This,
  IN     EFI_ISA_IO_PROTOCOL_OPERATION                        Operation,
  IN     UINT8                                                ChannelNumber         OPTIONAL,
  IN     UINT32                                               ChannelAttributes,
  IN     VOID                                                 *HostAddress,
  IN OUT UINTN                                                *NumberOfBytes,
  OUT    EFI_PHYSICAL_ADDRESS                                 *DeviceAddress,
  OUT    VOID                                                 **Mapping
  )
{
  EFI_STATUS            Status;
  BOOLEAN               Master;
  BOOLEAN               Read;
  EFI_PHYSICAL_ADDRESS  PhysicalAddress;
  ISA_MAP_INFO          *IsaMapInfo;
  UINT8                 DmaMode;
  UINTN                 MaxNumberOfBytes;
  UINT32                BaseAddress;
  UINT16                Count;
  UINT8                 DmaMask;
  UINT8                 DmaClear;
  UINT8                 DmaChannelMode;

  if ((NULL == This) ||
      (NULL == HostAddress) ||
      (NULL == NumberOfBytes) ||
      (NULL == DeviceAddress) ||
      (NULL == Mapping)
      ) {
    return EFI_INVALID_PARAMETER;
  }

  //
  // Initialize the return values to their defaults
  //
  *Mapping = NULL;

  //
  // Make sure the Operation parameter is valid
  //
  if ((UINT32)Operation >= EfiIsaIoOperationMaximum) {
    return EFI_INVALID_PARAMETER;
  }

  if (ChannelNumber >= 8) {
    return EFI_INVALID_PARAMETER;
  }

  //
  // See if this is a Slave DMA Operation
  //
  Master  = TRUE;
  Read    = FALSE;
  if (Operation == EfiIsaIoOperationSlaveRead) {
    Operation = EfiIsaIoOperationBusMasterRead;
    Master    = FALSE;
    Read      = TRUE;
  }

  if (Operation == EfiIsaIoOperationSlaveWrite) {
    Operation = EfiIsaIoOperationBusMasterWrite;
    Master    = FALSE;
    Read      = FALSE;
  }

  if (!Master) {
    //
    // Make sure that ChannelNumber is a valid channel number
    // Channel 4 is used to cascade, so it is illegal.
    //
    if (ChannelNumber == 4 || ChannelNumber > 7) {
      return EFI_INVALID_PARAMETER;
    }
    //
    // This implementation only support COMPATIBLE DMA Transfers
    //
    if ((ChannelAttributes & EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SPEED_COMPATIBLE) == 0) {
      return EFI_INVALID_PARAMETER;
    }

    if ((ChannelAttributes &
         (EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SPEED_A |
          EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SPEED_B |
          EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SPEED_C)) != 0) {
      return EFI_INVALID_PARAMETER;
    }

    if (ChannelNumber < 4) {
      //
      // If this is Channel 0..3, then the width must be 8 bit
      //
      if (((ChannelAttributes & EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_WIDTH_8) == 0) ||
          ((ChannelAttributes & EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_WIDTH_16) != 0)
          ) {
        return EFI_INVALID_PARAMETER;
      }
    } else {
      //
      // If this is Channel 4..7, then the width must be 16 bit
      //
      if (((ChannelAttributes & EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_WIDTH_8) != 0) ||
          ((ChannelAttributes & EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_WIDTH_16) == 0)) {
        return EFI_INVALID_PARAMETER;
      }
    }
    //
    // Either Demand Mode or Single Mode must be selected, but not both
    //
    if ((ChannelAttributes & EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SINGLE_MODE) != 0) {
      if ((ChannelAttributes & EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_DEMAND_MODE) != 0) {
        return EFI_INVALID_PARAMETER;
      }
    } else {
      if ((ChannelAttributes & EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_DEMAND_MODE) == 0) {
        return EFI_INVALID_PARAMETER;
      }
    }
  }
  //
  // Map the HostAddress to a DeviceAddress.
  //
  PhysicalAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) HostAddress;
  if ((PhysicalAddress +*NumberOfBytes) > BASE_16MB) {
    //
    // Common Buffer operations can not be remapped.  If the common buffer
    // is above 16MB, then it is not possible to generate a mapping, so return
    // an error.
    //
    if (Operation == EfiIsaIoOperationBusMasterCommonBuffer) {
      return EFI_UNSUPPORTED;
    }
    //
    // Allocate an ISA_MAP_INFO structure to remember the mapping when Unmap()
    // is called later.
    //
    IsaMapInfo = AllocatePool (sizeof (ISA_MAP_INFO));
    if (IsaMapInfo == NULL) {
      *NumberOfBytes = 0;
      return EFI_OUT_OF_RESOURCES;
    }
    //
    // Return a pointer to the MAP_INFO structure in Mapping
    //
    *Mapping = IsaMapInfo;

    //
    // Initialize the MAP_INFO structure
    //
    IsaMapInfo->Operation         = Operation;
    IsaMapInfo->NumberOfBytes     = *NumberOfBytes;
    IsaMapInfo->NumberOfPages     = EFI_SIZE_TO_PAGES (*NumberOfBytes);
    IsaMapInfo->HostAddress       = PhysicalAddress;
    IsaMapInfo->MappedHostAddress = BASE_16MB - 1;

    //
    // Allocate a buffer below 16MB to map the transfer to.
    //
    Status = gBS->AllocatePages (
                    AllocateMaxAddress,
                    EfiBootServicesData,
                    IsaMapInfo->NumberOfPages,
                    &IsaMapInfo->MappedHostAddress
                    );
    if (EFI_ERROR (Status)) {
      FreePool (IsaMapInfo);
      *NumberOfBytes  = 0;
      *Mapping        = NULL;
      return Status;
    }
    //
    // If this is a read operation from the DMA agents's point of view,
    // then copy the contents of the real buffer into the mapped buffer
    // so the DMA agent can read the contents of the real buffer.
    //
    if (Operation == EfiIsaIoOperationBusMasterRead) {
      CopyMem (
        (VOID *) (UINTN) IsaMapInfo->MappedHostAddress,
        (VOID *) (UINTN) IsaMapInfo->HostAddress,
        IsaMapInfo->NumberOfBytes
        );
    }
    //
    // The DeviceAddress is the address of the maped buffer below 16 MB
    //
    *DeviceAddress = IsaMapInfo->MappedHostAddress;
  } else {
    //
    // The transfer is below 16 MB, so the DeviceAddress is simply the
    // HostAddress
    //
    *DeviceAddress = PhysicalAddress;
  }
  //
  // If this is a Bus Master operation then return
  //
  if (Master) {
    return EFI_SUCCESS;
  }
  //
  // Figure out what to program into the DMA Channel Mode Register
  //
  DmaMode = (UINT8) (B_8237_DMA_CHMODE_INCREMENT | (ChannelNumber & 0x03));
  if (Read) {
    DmaMode |= V_8237_DMA_CHMODE_MEM2IO;
  } else {
    DmaMode |= V_8237_DMA_CHMODE_IO2MEM;
  }

  if ((ChannelAttributes & EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_AUTO_INITIALIZE) != 0) {
    DmaMode |= B_8237_DMA_CHMODE_AE;
  }

  if ((ChannelAttributes & EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_DEMAND_MODE) != 0) {
    DmaMode |= V_8237_DMA_CHMODE_DEMAND;
  }

  if ((ChannelAttributes & EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SINGLE_MODE) != 0) {
    DmaMode |= V_8237_DMA_CHMODE_SINGLE;
  }
  //
  // A Slave DMA transfer can not cross a 64K boundary.
  // Compute *NumberOfBytes based on this restriction.
  //
  MaxNumberOfBytes = 0x10000 - ((UINT32) (*DeviceAddress) & 0xffff);
  if (*NumberOfBytes > MaxNumberOfBytes) {
    *NumberOfBytes = MaxNumberOfBytes;
  }
  //
  // Compute the values to program into the BaseAddress and Count registers
  // of the Slave DMA controller
  //
  if (ChannelNumber < 4) {
    BaseAddress = (UINT32) (*DeviceAddress);
    Count       = (UINT16) (*NumberOfBytes - 1);
  } else {
    BaseAddress = (UINT32) (((UINT32) (*DeviceAddress) & 0xff0000) | (((UINT32) (*DeviceAddress) & 0xffff) >> 1));
    Count       = (UINT16) ((*NumberOfBytes - 1) >> 1);
  }
  //
  // Program the DMA Write Single Mask Register for ChannelNumber
  // Clear the DMA Byte Pointer Register
  //
  if (ChannelNumber < 4) {
    DmaMask         = R_8237_DMA_WRSMSK_CH0_3;
    DmaClear        = R_8237_DMA_CBPR_CH0_3;
    DmaChannelMode  = R_8237_DMA_CHMODE_CH0_3;
  } else {
    DmaMask         = R_8237_DMA_WRSMSK_CH4_7;
    DmaClear        = R_8237_DMA_CBPR_CH4_7;
    DmaChannelMode  = R_8237_DMA_CHMODE_CH4_7;
  }

  Status = WritePort (
             This,
             DmaMask,
             (UINT8) (B_8237_DMA_WRSMSK_CMS | (ChannelNumber & 0x03))
             );
  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = WritePort (
             This,
             DmaClear,
             (UINT8) (B_8237_DMA_WRSMSK_CMS | (ChannelNumber & 0x03))
             );
  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = WritePort (This, DmaChannelMode, DmaMode);
  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = WriteDmaPort (
             This,
             mDmaRegisters[ChannelNumber].Address,
             mDmaRegisters[ChannelNumber].Page,
             mDmaRegisters[ChannelNumber].Count,
             BaseAddress,
             Count
             );
  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = WritePort (
             This,
             DmaMask,
             (UINT8) (ChannelNumber & 0x03)
             );
  if (EFI_ERROR (Status)) {
    return Status;
  }

  return EFI_SUCCESS;
}

/**
  Maps a memory region for DMA

  @param This                    A pointer to the EFI_ISA_IO_PROTOCOL instance.
  @param Operation               Indicates the type of DMA (slave or bus master), and if
                                 the DMA operation is going to read or write to system memory.
  @param ChannelNumber           The slave channel number to use for this DMA operation.
                                 If Operation and ChannelAttributes shows that this device
                                 performs bus mastering DMA, then this field is ignored.
                                 The legal range for this field is 0..7.
  @param ChannelAttributes       The attributes of the DMA channel to use for this DMA operation
  @param HostAddress             The system memory address to map to the device.
  @param NumberOfBytes           On input the number of bytes to map.  On output the number
                                 of bytes that were mapped.
  @param DeviceAddress           The resulting map address for the bus master device to use
                                 to access the hosts HostAddress.
  @param Mapping                 A resulting value to pass to EFI_ISA_IO.Unmap().

  @retval EFI_SUCCESS            The range was mapped for the returned NumberOfBytes.
  @retval EFI_INVALID_PARAMETER  The Operation or HostAddress is undefined.
  @retval EFI_UNSUPPORTED        The HostAddress can not be mapped as a common buffer.
  @retval EFI_DEVICE_ERROR       The system hardware could not map the requested address.
  @retval EFI_OUT_OF_RESOURCES   The memory pages could not be allocated.
**/
EFI_STATUS
EFIAPI
IsaIoMap (
  IN     EFI_ISA_IO_PROTOCOL            *This,
  IN     EFI_ISA_IO_PROTOCOL_OPERATION  Operation,
  IN     UINT8                          ChannelNumber  OPTIONAL,
  IN     UINT32                         ChannelAttributes,
  IN     VOID                           *HostAddress,
  IN OUT UINTN                          *NumberOfBytes,
  OUT    EFI_PHYSICAL_ADDRESS           *DeviceAddress,
  OUT    VOID                           **Mapping
  )
{
  //
  // Check if DMA is supported.
  //
  if ((PcdGet8 (PcdIsaBusSupportedFeatures) & PCD_ISA_BUS_SUPPORT_DMA) == 0) {
    return EFI_UNSUPPORTED;
  }
  //
  // Set Feature Flag PcdIsaBusSupportBusMaster to FALSE to disable support for
  // ISA Bus Master.
  //
  // So we just return EFI_UNSUPPORTED for these functions.
  //
  if ((PcdGet8 (PcdIsaBusSupportedFeatures) & PCD_ISA_BUS_ONLY_SUPPORT_SLAVE_DMA) != 0) {
    return IsaIoMapOnlySupportSlaveReadWrite (
             This,
             Operation,
             ChannelNumber,
             ChannelAttributes,
             HostAddress,
             NumberOfBytes,
             DeviceAddress,
             Mapping
             );

  } else {
    return IsaIoMapFullSupport (
             This,
             Operation,
             ChannelNumber,
             ChannelAttributes,
             HostAddress,
             NumberOfBytes,
             DeviceAddress,
             Mapping
             );
  }
}

/**
  Allocates pages that are suitable for an EfiIsaIoOperationBusMasterCommonBuffer mapping.

  @param[in]  This               A pointer to the EFI_ISA_IO_PROTOCOL instance.
  @param[in]  Type               The type allocation to perform.
  @param[in]  MemoryType         The type of memory to allocate.
  @param[in]  Pages              The number of pages to allocate.
  @param[out] HostAddress        A pointer to store the base address of the allocated range.
  @param[in]  Attributes         The requested bit mask of attributes for the allocated range.

  @retval EFI_SUCCESS            The requested memory pages were allocated.
  @retval EFI_INVALID_PARAMETER  Type is invalid or MemoryType is invalid or HostAddress is NULL
  @retval EFI_UNSUPPORTED        Attributes is unsupported or the memory range specified
                                 by HostAddress, Pages, and Type is not available for common buffer use.
  @retval EFI_OUT_OF_RESOURCES   The memory pages could not be allocated.
**/
EFI_STATUS
EFIAPI
IsaIoAllocateBuffer (
  IN  EFI_ISA_IO_PROTOCOL  *This,
  IN  EFI_ALLOCATE_TYPE    Type,
  IN  EFI_MEMORY_TYPE      MemoryType,
  IN  UINTN                Pages,
  OUT VOID                 **HostAddress,
  IN  UINT64               Attributes
  )
{
  EFI_STATUS            Status;
  EFI_PHYSICAL_ADDRESS  PhysicalAddress;

  //
  // Set Feature Flag PcdIsaBusOnlySupportSlaveDma to FALSE to disable support for
  // ISA Bus Master.
  // Or unset Feature Flag PcdIsaBusSupportDma to disable support for ISA DMA.
  //
  if (((PcdGet8 (PcdIsaBusSupportedFeatures) & PCD_ISA_BUS_SUPPORT_DMA) == 0) ||
      ((PcdGet8 (PcdIsaBusSupportedFeatures) & PCD_ISA_BUS_ONLY_SUPPORT_SLAVE_DMA) != 0)) {
    return EFI_UNSUPPORTED;
  }

  if (HostAddress == NULL) {
    return EFI_INVALID_PARAMETER;
  }

  if ((UINT32)Type >= MaxAllocateType) {
    return EFI_INVALID_PARAMETER;
  }
  //
  // The only valid memory types are EfiBootServicesData and EfiRuntimeServicesData
  //
  if (MemoryType != EfiBootServicesData && MemoryType != EfiRuntimeServicesData) {
    return EFI_INVALID_PARAMETER;
  }

  if ((Attributes & ~(EFI_ISA_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE | EFI_ISA_IO_ATTRIBUTE_MEMORY_CACHED)) != 0) {
    return EFI_UNSUPPORTED;
  }

  PhysicalAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) (BASE_16MB - 1);
  if (Type == AllocateAddress) {
    if ((UINTN) (*HostAddress) >= BASE_16MB) {
      return EFI_UNSUPPORTED;
    } else {
      PhysicalAddress = (UINTN) (*HostAddress);
    }
  }

  if (Type == AllocateAnyPages) {
    Type = AllocateMaxAddress;
  }

  Status = gBS->AllocatePages (Type, MemoryType, Pages, &PhysicalAddress);
  if (EFI_ERROR (Status)) {
    REPORT_STATUS_CODE (
      EFI_ERROR_CODE | EFI_ERROR_MINOR,
      EFI_IO_BUS_LPC | EFI_IOB_EC_CONTROLLER_ERROR
      );
    return Status;
  }

  *HostAddress = (VOID *) (UINTN) PhysicalAddress;
  return Status;
}

/**
  Frees memory that was allocated with EFI_ISA_IO.AllocateBuffer().

  @param[in] This                A pointer to the EFI_ISA_IO_PROTOCOL instance.
  @param[in] Pages               The number of pages to free.
  @param[in] HostAddress         The base address of the allocated range.

  @retval EFI_SUCCESS            The requested memory pages were freed.
  @retval EFI_INVALID_PARAMETER  The memory was not allocated with EFI_ISA_IO.AllocateBufer().
**/
EFI_STATUS
EFIAPI
IsaIoFreeBuffer (
  IN EFI_ISA_IO_PROTOCOL  *This,
  IN UINTN                Pages,
  IN VOID                 *HostAddress
  )
{
  EFI_STATUS  Status;

  //
  // Set Feature Flag PcdIsaBusOnlySupportSlaveDma to FALSE to disable support for
  // ISA Bus Master.
  // Or unset Feature Flag PcdIsaBusSupportDma to disable support for ISA DMA.
  //
  if (((PcdGet8 (PcdIsaBusSupportedFeatures) & PCD_ISA_BUS_SUPPORT_DMA) == 0) ||
      ((PcdGet8 (PcdIsaBusSupportedFeatures) & PCD_ISA_BUS_ONLY_SUPPORT_SLAVE_DMA) != 0)) {
    return EFI_UNSUPPORTED;
  }

  Status = gBS->FreePages (
                  (EFI_PHYSICAL_ADDRESS) (UINTN) HostAddress,
                  Pages
                  );
  if (EFI_ERROR (Status)) {
    REPORT_STATUS_CODE (
      EFI_ERROR_CODE | EFI_ERROR_MINOR,
      EFI_IO_BUS_LPC | EFI_IOB_EC_CONTROLLER_ERROR
      );
  }

  return Status;
}

redpajama_set_name: RedPajamaGithub


text:
Q: Terraform state conflict between vpc and vpc-peering modules I am using terraform and terragrunt for my companies aws infrastructure, general structure is like this, i have two main folder, one for modules, other one for environments and sourcing modules to environment folder using terragrunt, one module is for general vpc infrastructure, i have separate module for vpc-peering, i created separated folders for vpc and vpc-peering in environment folder, so both of them has different terraform state on s3, the problem is that vpc-peering is creating route-tables also and when i want to apply some changes on vpc module it deletes records created from vpc-peering module, is there any way to inject route tables into vpc module? I know that i can move vpc-peering module into vpc and have one both module but it takes quite some time to rewrite all the stuff and i would love to know any other way.

A: They shouldn't both be creating route tables. The VPC module should be creating route tables, and the VPC Peering module should be adding routes to those route tables. The trick here is to not create any routes in the aws_route_table resources, but create them all as separate aws_route resources. Per the note in the aws_route documentation:

Terraform currently provides both a standalone Route resource and a
Route Table resource with routes defined in-line. At this time you
cannot use a Route Table with in-line routes in conjunction with any
Route resources. Doing so will cause a conflict of rule settings and
will overwrite rules.

So in order to define routes in multiple modules you will need to use the aws_route resource for all route definitions.

A: I am not sure if you are using git as source code for the terraform, if yes then you can keep the modules in the separate git repository and call the module for route table as you want.
eg. :
resouces "aws_route" "public_igw_route" {
  source = "git@github.com:user/infra-modules.git//aws-route"
}

redpajama_set_name: RedPajamaStackExchange